現在、テーブルごとのタイプ (TPT) を使用して Entity Framework 4.0 モデルを配置していますが、いくつかのパフォーマンスの問題 (多くの LOJ/CASE ステートメント) と、2 つの特定のドメイン領域間の問題のマッピング (多対多) があります。たくさんの)。
TPHを試してみることにしました。
私は「Location」という抽象的エンティティと、他のすべてのエンティティのベースとなるエンティティを持っています。
次に、「Country」、「City」、「State」、「Street」などをすべて Location から派生させます。
「LocationType」は識別子です。
その部分は正常に機能していますが、派生型のナビゲーション プロパティを定義しようとして問題が発生しています。
たとえば、「州」には単一の「国」があるため、これを実行できるはずです。
var state = _ctx.Locations.OfType<State>().Include("Country").First();
var countryForState = state.Country;
ただし、これには、"State" 派生エンティティの "Country" というナビゲーション プロパティが必要です。どうすればいいですか?データベースからモデルを生成すると、すべての FK が同じテーブル内のレコードを指している単一のテーブルがあります。
(注: これらの FK は DB で手動で作成しました)。
しかし、FK は " Location " エンティティのナビゲーションとして配置されているため、これらのナビゲーション プロパティを派生エンティティに移動するにはどうすればよいでしょうか? ナビゲーションをコピーして貼り付けることはできません。開始/終了の役割を定義できないため、「新しいナビゲーション プロパティを作成する」こともできません。
どうやってこれを行うのですか?
また、モデル ファーストで実行できるかどうか、または DB から開始し、モデルを修正してから DB を再生成する必要があるかどうかも、TPH では明確ではありません。TPH の子供のナビゲーションを定義する方法について、インターネット上で良い例をまだ見つけていません。
注: code-first を実行したくありません。私の現在のソリューションには、EDMX を使用した TPT と純粋な POCO があります。(可能であれば) ドメイン モデル/リポジトリに影響を与えず、EF モデル/データベースを更新することを望んでいます。
編集
まだ解決策はありませんが、モデルを最初に実行しようとしていて、[追加] -> [新しい関連付け] を実行しています。これにより、実際には、派生エンティティにナビゲーションを追加できます。しかし、「モデルからデータベースを生成」しようとすると、「Location_Street」、「Location_Country」などのテーブルを作成しようとします。最初にモデルを作成できないようです。
編集
これが私の現在のモデルです:
現在取得している検証エラー:
エラー 1 エラー 3002: 359 行目から始まるフラグメントのマッピングの問題: テーブルの場所のキー (Locations.LocationId) のランタイム違反の可能性: 列 (Locations.LocationId) は、概念側で EntitySet NeighbourhoodZipCode のプロパティ (NeighbourhoodZipCode.Neighbourhood.LocationId) にマップされますただし、それらは EntitySet のキー プロパティ (NeighbourhoodZipCode.Neighbourhood.LocationId、NeighbourhoodZipCode.ZipCode.LocationId) を形成しません。
私が現在どこにいるかに関する編集でこの質問を編集し続けると思っただけです。自己参照 FK を使用した TPH が可能であるかどうか疑問に思い始めています。
編集
だから私は上記のエラーを見つけました。これは、Neighbourhood-ZipCode 多対多の結合テーブルが欠落していたためです。
結合テーブルを追加して(そしてそれにナビをマッピングして)上記のエラーを解決しました。
しかし、今はこのエラーが発生しています:
エラー 3032: 行 373、382 で始まるフラグメントのマッピングに問題があります: 条件メンバー 'Locations.StateLocationId' に重複した条件値があります。
CSDL を見ると、「CountyState」の関連付けマッピングは次のとおりです (州には多くの郡があり、郡には 1 つの州があります)。
<AssociationSetMapping Name="CountyState" TypeName="Locations.CountyState" StoreEntitySet="Locations">
<EndProperty Name="State">
<ScalarProperty Name="LocationId" ColumnName="StateLocationId" />
</EndProperty>
<EndProperty Name="County">
<ScalarProperty Name="LocationId" ColumnName="LocationId" />
</EndProperty>
<Condition ColumnName="StateLocationId" IsNull="false" />
</AssociationSetMapping>
関連付けもこの状態であるため、Condition ColumnName="StateLocationId"
それは不平を言っていることです。ZipCodeState
しかし、私はそれを取得しません。すべてのエンティティの識別子は一意であり (トリプル チェック済み)、これは有効なシナリオだと思っていたでしょう。
- 郡には、StateLocationId (場所テーブル) で示される単一の州があります。
- ZipCode には、StateLocationId (Locations テーブル) で示される単一の State があります。
それはTPHでは有効ではありませんか?