EF6 Code First,Context fluent API:如何为多个实体设置相同的字段属性?

时间:2017-07-05 10:35:20

标签: c# entity-framework-6

我有几个从同一基类继承的entites

public class BaseEntity
{
   public string CreatedUser { get; set; }
   public DateTime? CreatedDate { get; set; }
   public string ChangedUser{ get; set; }
   public DateTime? ChangedDate { get; set; }

}

现在在我的上下文构建器中,我不希望在每个构建器方法中单独分配这些字段属性。

我想要一个通用的方法,我可以添加到每个授权构建器方法,如

private static void BasisFields(DbModelBuilder modelBuilder, Entity<TEntity> entitiy)
{
    modelBuilder.entitiy()
        .Property(k => k.CreatedUser)
        .HasMaxLength(32)
        .HasColumnType("varchar");

    modelBuilder.entitiy()
        .Property(k => k.CreatedDate)
        .HasColumnType("datetime");

    modelBuilder.entitiy()
        .Property(k => k.ChangedUser)
        .HasMaxLength(32)
        .HasColumnType("varchar");

    modelBuilder.entitiy()
        .Property(k => k.ChangedDate)
        .HasColumnType("datetime");

}

但上面的代码不正确,因为我是C#初学者......

它应该是什么样的?

1 个答案:

答案 0 :(得分:2)

您可以使方法通用:

private static void BasisFields<T>(DbModelBuilder modelBuilder)
    where T : BaseEntity
{
    modelBuilder.Entity<T>()
        .Property(k => k.CreatedUser)
        .HasMaxLength(32)
        .HasColumnType("varchar");

    modelBuilder.Entitity<T>()
        .Property(k => k.CreatedDate)
        .HasColumnType("datetime");

    modelBuilder.Entity<T>()
        .Property(k => k.ChangedUser)
        .HasMaxLength(32)
        .HasColumnType("varchar");

    modelBuilder.Entity<T>()
        .Property(k => k.ChangedDate)
        .HasColumnType("datetime");    
}

通用约束where T : BaseEntity确保您只能使用继承BaseEntity的类型调用它,并允许您访问方法体内的BaseEntity属性。

现在你应该为每个继承BaseEntity的实体(如

)调用它
BasisFields<DerivedEntityA>(modelBuilder);
BasisFields<DerivedEntityB>(modelBuilder);
...

如果要为继承BaseEntity的每个实体自动创建该流程,可以使用DbModelBuilder.Types<T>方法:

  

开始轻量级约定的配置,该约定适用于模型中继承或实现泛型参数指定的类型的所有实体和复杂类型。

因此,您可以简单地使用:

,而不是编写方法并为每个派生实体调用它
modelBuilder.Types<BaseEntity>().Configure(c =>
{
    c.Property(k => k.CreatedUser)
        .HasMaxLength(32)
        .HasColumnType("varchar");

    c.Property(k => k.CreatedDate)
        .HasColumnType("datetime");

    c.Property(k => k.ChangedUser)
        .HasMaxLength(32)
        .HasColumnType("varchar");

    c.Property(k => k.ChangedDate)
        .HasColumnType("datetime");    
});