EF:抽象ベースといくつかの具象型が TPH テーブルにあり、他の型が独自のテーブルを持つ場合、TPH と TPT を混合できますか?

StackOverflow https://stackoverflow.com/questions/6034985

質問

まず第一に、これらの質問は似ていますが、明らかに同じではありません。

Entity Framework で階層ごとのテーブルとタイプごとのテーブルを混在させることはできますか? - 別のシナリオを参照します。

エンティティフレームワーク:タイプごとのテーブルと階層ごとのテーブルを混在させる - さらに別のシナリオ。最初のシナリオに対する回答を受け入れたにもかかわらず、それとは関係がありません (*)。

(*) 次に、エンティティごとのテーブルと階層ごとのテーブルの識別子を持つテーブルを使用して基本エンティティがマップされている場合、Entity Framework でタイプごとのテーブルと階層ごとのテーブルを正常に混合しました。チェーンの下の方にあります。


次のものをマッピングしようとしています:

テーブル:

BaseTable
{
    int PK1;
    int PK2;
    string? Value1;
    double? Value2;
}

ChildTable3
{
    int PK1;
    int PK2;
    int Value;
}

エンティティ:

abstract BaseEntity : class // Maps to BaseTable
{
    int PK1; // Maps to PK1 in relevant table
    int PK2; // Maps to PK2 in relevant table
}

Entity1 : BaseEntity // Maps to BaseTable when Value1 != null
{
    string Value; // Maps to Value1
}

Entity2 : BaseEntity // Maps to BaseTable when Value1 == null && Value2 != null
{
    double Value; // Maps to value2
}

Entity3 : BaseEntity // Maps to ChildTable3
{
    int Value; // Maps to value
}

Entity3 マッピングを追加する前は機能していました。

Entity3 とそのマッピングを追加した後、コンパイル中に次のエラーが発生します。

エラー 1 エラー 3026:980、986、995 行目から始まるマッピング フラグメントの問題: テーブル BaseTable でデータ損失またはキー制約違反が発生する可能性があります。キー (PK) を持つエンティティは、次の場合にはラウンドトリップしません。(PK は 'BaseTables' EntitySet にあり、エンティティは [MyNamespace.Entity3] 型です) Path o\My.edmx 981 15 MyAssembly

  • これを機能させる方法はありますか?
  • これを機能させるために edmx をハッキングできる場合、データベースからの更新ごとにハッキングが失われるのでしょうか?
役に立ちましたか?

解決

デザイナーを介してこのようなマッピングを実行できるワークフローを見つけました。

  1. BaseEntity、Entity1、Entity2、Entity3の作成
  2. BaseEntity を抽象として BaseTable にマップする
  3. 条件付きで Entity1 を BaseTable にマップします
  4. 条件付きでEntity2をBaseTableにマッピング
  5. Entity3 を ChildTable3 にマップする
  6. マップを解除する ベースエンティティ

後で子テーブルを追加するには:

  1. BaseEntity を再マップする
  2. 新しい子テーブルをマッピングする
  3. BaseEntity のマップを解除する
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top