[英]EF6 Code First, Context fluent API: How to set same field properties for multiple entities?
我有从相同基类继承的服务器实体
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#初学者。
它看起来如何?
您可以使方法通用:
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");
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.