3

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?

Marc Cals
  • 2,963
  • 4
  • 30
  • 48
Abi P
  • 1,410
  • 3
  • 22
  • 36
  • http://stackoverflow.com/questions/19554050/entity-framework-6-code-first-default-value – jjj Jun 19 '15 at 19:11

2 Answers2

5

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;
    }
}
Marc Cals
  • 2,963
  • 4
  • 30
  • 48
1

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();
    }
    
shalitha senanayaka
  • 1,905
  • 20
  • 37