EF 6 Codefirst - 使用fluent API设置基类中定义的属性的默认值

时间:2015-06-19 18:39:22

标签: entity-framework entity-framework-6 ef-fluent-api

我有一个基类,它具有审计属性,如

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; }
}

我所有的poco课程都来自这门课程。

我正在尝试为IsActive属性设置默认值。我并不热衷于使用注释,因此如果我可以使用流畅的API工作,那就是徘徊。

我尝试了这个,但它不起作用。好像它会创建一个名为BaseModel的新表

modelBuilder.Entity<BaseModel>()
    .Property(p => p.IsActive)
    .HasColumnAnnotation("DefaultValue", true);

任何人都可以在这里提出建议吗?

2 个答案:

答案 0 :(得分:4)

没有办法做到这一点。它无法使用Entity Framework设置默认值。相反,您可以使用构造函数

public abstract class BaseModel
{
    protected BaseModel()
    {
        IsActive = true;
    }
}

答案 1 :(得分:1)

我已通过覆盖 SaveChanges 方法解决了此问题。请参阅下面的解决方案。

  1. 解决方案说明

    i)覆盖DbContext类中的SaveChanges方法。

    public override int SaveChanges()
    {
        return base.SaveChanges();
    }
    

    ii)编写逻辑以设置默认值

    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. 示例

    i)创建基类

      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)覆盖 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();
    }