3

I am doing code first EF Core 2.0 migrations. I have few columns which are common across all entities. All entities inherit this class as shown below.

How do I set the default value for CreateDate as current date, CreateBy as 'System' and IsDeleted as 0?

public class BaseEntity
{
    public DateTime CreateDate { get; set; }

    public string CreateBy { get; set; }

    public bool IsDeleted { get; set; }
}

I know how to do this for a single property. ie.

class MyContext : DbContext
{
    public DbSet<CaseDetails> CaseDetails{ get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<CaseDetail>()
            .Property(b => b.CreateDate)
            .HasDefaultValueSql("getutcdate()");

        modelBuilder.Entity<CaseDetail>()
            .Property(b => b.CreateBy)
            .HasDefaultValue("System");

        modelBuilder.Entity<CaseDetail>()
            .Property(b => b.IsDeleted)
            .HasDefaultValue("0()");
    }
}

Can anyone help me how to do this in an efficient way so it will be available for all entities?

Thanks

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Mukil Deepthi
  • 6,072
  • 13
  • 71
  • 156
  • 1
    Similar to [Filter all queries (trying to achieve soft delete)](https://stackoverflow.com/questions/45096799/filter-all-queries-trying-to-achieve-soft-delete/45097532#45097532), but configuring properties instead of setting filter. – Ivan Stoev Jan 10 '18 at 12:03

2 Answers2

14

Here is one way to do it.

foreach (var entityType in modelBuilder.Model.GetEntityTypes()
    .Where(t => t.ClrType.IsSubclassOf(typeof(BaseEntity))))
{
    modelBuilder.Entity(
        entityType.Name,
        x =>
        {
            x.Property("CreateDate")
                .HasDefaultValueSql("getutcdate()");

            x.Property("CreateBy")
                .HasDefaultValue("System");

            x.Property("IsDeleted")
                .HasDefaultValue(false);
        });
}
bricelam
  • 28,825
  • 9
  • 92
  • 117
7

Correct way with latest version of net.core 2.0:

    foreach (var entityType in builder.Model.GetEntityTypes()
        .Where(e => typeof(Entity<int>).IsAssignableFrom(e.ClrType)))
    {
        builder
            .Entity(entityType.ClrType)
            .Property("CreatedDate")
            .HasDefaultValueSql("getutcdate()");
    }
sensei
  • 7,044
  • 10
  • 57
  • 125