我正在尝试将每个层次结构的表(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 来解决这个问题,但我更愿意避免这种情况,因为它是一个现有的数据库。