1

我正在尝试将每个层次结构的表(TPH)与两个从抽象基础继承的类一起使用:

public abstract class StatusLog : EntityBase
{
    public StatusLog()
        : base()
    {
        StatusChangeValidations = new List<StatusChangeValidation>();
    }

    public virtual List<StatusChangeValidation> StatusChangeValidations { get; set; }
    public int StatusId { get; set; }

}

public class DisputeStatusLog : StatusLog
{
    public virtual Dispute Dispute { get; set; }
}

public class StatementStatusLog : StatusLog
{
    public virtual Statement Statement { get; set; }
}

我已经像这样映射它们:

public class StatusLogMap : EntityTypeConfiguration<StatusLog>
{
    public StatusLogMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);

                    ...
    }
}

public class DisputeStatusLogMap : EntityTypeConfiguration<DisputeStatusLog>
{
    public DisputeStatusLogMap()
    {
        // Relationships
        this.HasRequired(t => t.Dispute)
            .WithMany(t => t.StatusLogs)
            .Map(m => m.MapKey("ObjectInstanceID"));
    }
}

public class StatementStatusLogMap : EntityTypeConfiguration<StatementStatusLog>
{
    public StatementStatusLogMap()
    {
        // Relationships
        this.HasRequired(t => t.Statement)
            .WithMany(t => t.StatusLogs)
            .Map(m => m.MapKey("ObjectInstanceID"));
    }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<StatusLog>()
                    .Map<DisputeStatusLog>(e => e.Requires("ObjectID").HasValue("28"))
                    .Map<StatementStatusLog>(e => e.Requires("ObjectID").HasValue("111"));
}

我预计这会起作用,但它会立即导致验证异常:

ObjectInstanceID: Name: Each property name in a type must be unique. Property name 'ObjectInstanceID' is already defined.

为 ObjectInstanceID 添加外键属性并将映射更改为使用 HasForeignKey 而不是 MapKey 会导致稍有不同的错误:

ObjectInstanceID: : There is no property with name 'ObjectInstanceID' defined in the type referred to by Role 'StatusLog'.

我的映射是否有问题,或者这是实体框架尚不支持的场景?我目前正在使用 EF 6.01 的 9/23 nightly build,正如我在 EF CodePlex 网站上看到的那样,它可能已经解决了这个问题,但我在 EF 6 RC1 上遇到了完全相同的错误。

我知道我可以通过将这些类拆分为多个表并使用 TPT 来解决这个问题,但我更愿意避免这种情况,因为它是一个现有的数据库。

4

0 回答 0