EF 6 Codefirst -Setting default value for a property defined in base class using fluent API

4.7k views Asked by At

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?

2

There are 2 answers

0
Marc Cals On

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;
    }
}
0
shalitha senanayaka On

I have resolved this problem by overriding the SaveChanges method. See below for my solution.

  1. 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();
    }
    
  2. 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();
    }