【发布时间】:2018-08-09 09:15:40
【问题描述】:
假设我有一些界面,例如:
public interface ISoftDeletable
{
bool IsActive { get; set }
}
我有很多实体实现它:
public class Entity1 : ISoftDeletable
{
public int Id { get; set }
public bool IsActive { get; set; }
}
public class Entity2 : ISoftDeletable
{
public int Id { get; set }
public bool IsActive { get; set; }
}
在OnModelCreating:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity1>().Property(e => e.IsActive).HasDefaultValue(true);
modelBuilder.Entity<Entity2>().Property(e => e.IsActive).HasDefaultValue(true);
}
有什么方法可以重构它,以便我可以为所有实现ISoftDeletable 的实体设置HasDefaultValue,而不是像上面那样做?
我可能可以使用IsActive = true 为每个实体使用默认构造函数来解决这个特定情况,甚至可以创建一个基本抽象类,但我不太喜欢它。
类似问题:Ef core fluent api set all column types of interface
有没有更好的办法?
【问题讨论】:
-
扩展方法?仍然需要列出您需要绑定的每个实体,但不需要继续执行 Property.HasDefaultValue。
-
在实体类中使用自动属性初始化器?
public bool IsActive { get; set; } = true;或将属性名称“反转”为“IsDeleted”之类的名称,以便它自动获取正确的默认值。 -
拥有具有属性和默认值的抽象类看起来是不错的选择。不知道你为什么不想要它。
-
那么你在另一个问题中有这个选项,一个基本配置类,它将设置你需要的东西。如果您不想改变整个结构,如何进行配置并引入新的配置类,则可以选择扩展方法,它至少可以部分抽象它。
-
从 EF6 开始,我会使用
modelBuilder.Types<ISoftDeletable>().Configure(c => c.Property(e => e.IsActive).HasDefaultValue(true))这样的东西,但是 EF6 没有HasDefaultValue,我不知道 EF Core 是否仍然支持Types配置。跨度>