4

TPC スタイルで Entity Framework を使用していくつかのクラスをマップしようとしたところ、次のエラーが発生しました。

エラー: 型 'A' は、エンティティ分割または別の形式の継承を使用する型から継承されたプロパティをマップするため、定義どおりにマップできません。継承されたプロパティをマップしないように別の継承マッピング戦略を選択するか、階層内のすべての型を変更して継承されたプロパティをマップし、分割を使用しないようにしてください。

このエラーは、次のクラスを使用すると発生します。

public abstract class BaseEntityTest
public abstract class BaseEntityTest2 : BaseEntityTest
public abstract class BaseEntityTest3 : BaseEntityTest2
public class A: BaseEntityTest3 // this class is the only one with a table in the db

OnModelCreating メソッドで、次のコードを追加して TPC マッピングを取得しました

modelBuilder.Entity<A>().Map(m =>
{
  m.MapInheritedProperties();
  m.ToTable("A");
});

構造から BaseEntityTest2 を除外すると (A が BaseEntityTest2 ではなく BaseEntityTest からのみ継承されるように)、エラーはなくなります。これは、このマッピングを作成できないということですか、それとも単に何かが足りないのでしょうか?

編集:

クラスのプロパティ:

public abstract class BaseEntityTest
{

    [Key]
    public Guid Id { get; set; }

    public String Info { get; set; }

    [Required]
    public DateTime CreationDate { get; set; }

    [Required]
    public String CreationUser { get; set; }

    [Required]
    public DateTime ModificationDate { get; set; }

    [Required]
    public String ModificationUser { get; set; }

    [ConcurrencyCheck]
    [Required]
    public int LockVersion { get; internal set; }
}

public abstract class BaseEntityTest2 : BaseEntityTest
{
    [Required]
    public string Name { get; set; }

    public string Description { get; set; }

}

public abstract class BaseEntityTest3: BaseEntityTest2 
{

    [Required]
    public DateTime FromDate { get; set; }

    public DateTime ThruDate { get; set; }
}

public class A: BaseEntityTest3{
    public String Test { get; set; }
}
4

2 に答える 2

7

エラーは EF 4.3.1 以前のバージョンで発生しますが、EF 4.4 と EF 5.0 では発生しません。(EF 4.4 は実際には EF 5.0 ですが、ターゲット プラットフォームとして .NET 4.0 を使用しています。)

BUT: エラーは、抽象クラスをモデル内のエンティティとして使用している場合にのみ発生します。つまり、

  • DbSetのように、コンテキストクラスにそれらの s があります

    public DbSet<BaseEntityTestX> BaseEntityTestXs { get; set; }
    
  • BaseEntityTestXまたは、いくつかのFluentマッピングがありmodelBuilder.Entity<BaseEntityTestX>()...ます

  • または、いずれかをBaseEntityTestX別の (具体的な) エンティティ タイプのナビゲーション プロパティとして使用している

これは必要ですか?

コンテキストに a を持つことはDbSet<BaseEntityTestX>、次のような抽象的なエンティティの 1 つを本当にクエリしたい場合にのみ意味があります。

List<BaseEntityTest> list = context.BaseEntityTests
    .Where(b => b.Info == "abc").ToList();

結果はもちろん、 から継承する具体的なエンティティのリストですが、いくつかの といくつかの のBaseEntityTestように、異なるタイプが混在している可能性があります。そのようなクエリが必要ですか?または、具体的なオブジェクトの一部に対してのみクエリを実行しますか?AB

List<A> list = context.As
    .Where(b => b.Info == "abc").ToList();

後者の場合DbSet、抽象基本クラスの は必要なく、継承マッピングも必要ありません。DbSet<BaseEntityTestX>コンテキスト クラスから を削除し、TPC マッピングを削除するだけで、エラーは解消されます。

最後のポイント (別のエンティティの抽象エンティティの 1 つへのナビゲーション プロパティを持つこと) は、TPC マッピングでは意味がありません。TPC マッピングには抽象エンティティ用のテーブルがないため、リレーショナル データベースにマップできません。したがって、外部キー関係がナビゲーション プロパティを持つ具象クラスのテーブルから参照できるターゲットがありません。

TPC マッピングを基本クラスに拡張すると、エラーも表示されなくなります。

modelBuilder.Entity<BaseEntityTestX>().Map(m =>
{
    m.MapInheritedProperties();
    m.ToTable("BaseEntityTestX");
});

しかし、私には意味がないように見える抽象的なエンティティのテーブルが作成されます。

于 2012-11-29T17:14:40.953 に答える
3

EF6.0では、いつ発生したか

EntityTypeConfiguration'<'YourBaseClass'>'

すべての派生クラスを詳しく説明しませんでした

        this.Map<DerivedClass1>(m =>
        {
            m.MapInheritedProperties();
            m.ToTable("..");
        });

アセンブリ内の派生クラスが 1 つだけ構成されていない場合、この例外が発生します。

于 2014-06-25T12:04:50.000 に答える