Reputation: 1450
I have a base class which has audit properties like
public abstract class BaseModel
{
[Column(Order = 1)]
public long Id { get; set; }
public long CreatedBy { get; set; }
public DateTime CreatedDate { get; set; }
public long ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public bool IsActive { get; set; }
}
All my poco classes derive from this class.
I am trying to set a default value to the IsActive properties. I am not keen on using annotations and hence was wandering if I can work this using fluent API.
I tried this but it does not work. Seems like it creates a new table named BaseModel
modelBuilder.Entity<BaseModel>()
.Property(p => p.IsActive)
.HasColumnAnnotation("DefaultValue", true);
Can any one suggest a way here?
Upvotes: 3
Views: 4845
Reputation: 2538
I have resolved this problem by overriding the SaveChanges method. See below for my solution.
Solution Explain
i) Override the SaveChanges method in the DbContext class.
public override int SaveChanges()
{
return base.SaveChanges();
}
ii) Write logic to set default values
public override int SaveChanges()
{
//set default value for your property
foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("YOUR_PROPERTY") != null))
{
if (entry.State == EntityState.Added)
{
if (entry.Property("YOUR_PROPERTY").CurrentValue == null)
entry.Property("YOUR_PROPERTY").CurrentValue = YOUR_DEFAULT_VALUE;
}
}
return base.SaveChanges();
}
Example
i) Create Base Class
public abstract class BaseModel
{
[Column(Order = 1)]
public long Id { get; set; }
public long CreatedBy { get; set; }
public DateTime CreatedDate { get; set; }
public long ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public bool IsActive { get; set; }
}
ii) override SaveChanges
public override int SaveChanges()
{
//set default value for IsActive property
foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("IsActive") != null))
{
if (entry.State == EntityState.Added)
{
if(entry.Property("IsActive").CurrentValue == null)
entry.Property("IsActive").CurrentValue = false;
}
}
return base.SaveChanges();
}
Upvotes: 2
Reputation: 2989
There is no way to do this. It can't set default values with Entity Framework. Instead you can use the constructor
public abstract class BaseModel
{
protected BaseModel()
{
IsActive = true;
}
}
Upvotes: 5