0

TPC 継承を使用して、複雑なオブジェクト モデルを既存のデータベースにマップしています。継承構造の中間レベルでリレーションシップを作成すると、問題が発生します。

public class ParentClass
{
}

public class MiddleClass : ParentClass
{
    public Int64 RelationshipId;
    public Relationship Relationship;
}

public class ChildClass1 : MiddleClass
{
}

public class ChildClass2: MiddleClass
{
}

public class Relationship
{
    public string RelationshipInfo { get; set; }
}

public class MyEntities : DbContext
{
    public DbSet<ParentClass> Parents
    public override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ChildClass1>.Map(m => m.MapInheritedProperties);
        modelBuilder.Entity<ChildClass2>.Map(m => m.MapInheritedProperties);

        modelBuilder.Entity<MiddleClass>.HasRequired(mc => mc.Relationship).WithMany().HasForeignKey(mc => mc.RelationshipId);
    }
}

行を追加するまで、私のモデルは機能しmodelBuilder.Entity<MiddleClass>.HasRequired(mc => mc.Relationship).WithMany().HasForeignKey(mc => mc.RelationshipId);ます。この関係をすべての子供にマッピングする必要がありますか?

私が受け取ったエラーは、「型 "MiddleClass" は、エンティティ分割または別の形式の継承を使用する型から継承されたプロパティをマップするため、定義されたとおりにマップできません」です。

4

1 に答える 1

0

私は答えを(一種の)ここで見つけました。基本的な答えは、継承されたクラスはデータベース内のテーブルとして表されないため、それらのテーブルでリレーションシップを作成できないというものです。

そのように親クラスを介して継承されたプロパティをマップしようとしても機能しません:

modelBuilder.Entity<ChildClass>()
            .HasRequired(cc => cc.Relationship).WithMany().HasForeignKey(cc => cc.RelationshipId);

Relationship オブジェクトがまだ MiddleClass の「テーブル」の一部であることを認識し、そこにマップしようとします。唯一のアクションは、すべての関係オブジェクトを子クラスに含めることです。

public class ParentClass
{
}

public class MiddleClass : ParentClass
{
    public Int64 RelationshipId;
    public Relationship Relationship;
}

public class ChildClass1 : MiddleClass
{
    public Int64 RelationshipId;
    public Relationship Relationship;
}

public class ChildClass2: MiddleClass
{
    public Int64 RelationshipId;
    public Relationship Relationship;
}

public class Relationship
{
    public string RelationshipInfo { get; set; }
}

これは最善の解決策ではありませんが、おそらく EntityConfigurations の継承された構造を介してマッピングを行うことができます。

于 2012-07-19T15:37:30.130 に答える