抽象ベースから継承する 2 つのクラスで階層ごとのテーブル (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 の外部キー プロパティを追加し、MapKey の代わりに HasForeignKey を使用するようにマッピングを変更すると、わずかに異なるエラーが発生します。
ObjectInstanceID: : There is no property with name 'ObjectInstanceID' defined in the type referred to by Role 'StatusLog'.
マッピングに何か問題がありますか、それとも Entity Framework がまだサポートしていないシナリオですか? 私は現在、EF 6.01 の 9/23 ナイトリー ビルドを使用しています。これは、EF CodePlex サイトでこの問題を修正した可能性があることを読んだのですが、EF 6 RC1 でまったく同じエラーが発生しました。
これらのクラスを複数のテーブルに分割し、TPT を使用することでこれを修正できることはわかっていますが、これは既存のデータベースであるため、これは避けることをお勧めします。