对实现接口的所有类型都有特定的 属性 配置,但一个除外

Have specific property configuration for all types that implement an interface except for one

我有一些继承自接口 'IEventReportElement' 的类型,它公开了 属性 'IdEventReport':

public interface IEventReportElement
{
    long Id { get; set; }
    long? IdEventReport { get; set; }
}

这是一个可以为 null 的 属性,因为我并不总是能够立即正确填写它,但在数据库中应该是不可为 null 的。

这就是我添加行的原因

modelBuilder.Types<IEventReportElement>().Configure(x=>x.Property(y=>y.IdEventReport).IsRequired());

我在 DbContext 中的 OnModelCreating 方法。

但是,类型 'Position' 必须实现此接口,但不应在数据库中包含 属性 'IdEventReport' 的列,而是 [=37] 的列=] 'IdParent' 它暴露了。

public class Position : BOBase, IEventReportElement
{
    public long? IdEventReport 
    {
        get { return IdParent; }
        set { IdParent = value; }
    }

    public long? IdParent { get; set; }
}

和模型构建器中的部分

        modelBuilder.Entity<Position>().Property(x => x.IdParent).IsRequired();
        modelBuilder.Entity<Position>().Ignore(x => x.IdEventReport);

但是,这在尝试创建数据库时已经抛出异常:

System.InvalidOperationException: The property 'IdEventReport' is not a declared property on type 'Position'. Verify that the property has not been explicitly excluded from the model by using the Ignore method or NotMappedAttribute data annotation. Make sure that it is a valid primitive property.

虽然这可能是有效的,但是否无法覆盖特定类型的给定类型配置?我是否必须将行 .IsRequired() 添加到实现此接口的所有其他类型,或者是否有其他方法来克服此问题?

如果您只是希望该列在数据库中具有不同的名称,请使用 HasColumnName

要在 C# 模型中访问 IdParent,请使用 [NotMapped] 告诉 EF 在创建数据库时忽略此 属性。

public class Position : BOBase, IEventReportElement {
    public long? IdEventReport {get; set; }

    [NotMapped]
    public long? IdParent {
        get { return IdEventReport ; }
        set { IdEventReport = value; }
    } 
}

modelBuilder.Entity<Position>().Property(x => x.IdEventReport).HasColumnName("IdParent");

附带说明:您为什么要实现一个您不想使用的接口?也许您可以将界面拆分成更小的部分,只实现您将要使用的部分。

我确实找到了解决方案,但不是很好。我通过将类型配置的行修改为

modelBuilder.Types<IEventReportElement>().Where(x=>x.Name!="Position").Configure(x=>x.Property(y=>y.IdEventReport).IsRequired());