0

我有许多从接口“IEventReportElement”继承的类型,它公开了属性“IdEventReport”:

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

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

这就是我添加该行的原因

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

到我在 DbContext 中的 OnModelCreating 方法。

但是,“位置”类型必须实现此接口,但不应在数据库中具有属性“IdEventReport”的列,而是它公开的属性“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:属性“IdEventReport”不是“Position”类型的声明属性。使用 Ignore 方法或 NotMappedAttribute 数据注释验证该属性是否已从模型中显式排除。确保它是有效的原始属性。

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

4

2 回答 2

0

如果您只是希望该列在数据库中具有不同的名称,请使用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");

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

于 2016-09-08T08:08:21.717 回答
0

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

modelBuilder.Types<IEventReportElement>().Where(x=>x.Name!="Position").Configure(x=>x.Property(y=>y.IdEventReport).IsRequired());
于 2016-09-08T08:09:48.507 回答