問題タブ [table-per-hierarchy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 階層ごとのテーブルが EF6 の既定の動作ではない
これら 3 つのクラスを 1 つの EF テーブルにマップしようとしています。このシナリオでは、基本クラスに実際に基本エンティティ クラスがありますが、これが問題の原因ですか? デフォルトの動作が適切に処理されないシナリオをカバーする例は見つかりません。
基本クラス:
子クラス:
エンティティ基本クラス:
c# - 階層ごとのテーブルと複合主キー
次のようなデータを含むレガシー データベース (変更できない) に 2 つのテーブルがあります。
Table1 には複合主キー (Code、Abbrev) がありますが、Abbrev は識別子としても使用されます (以下を参照)。Table2 には 2 つの外部キー列 (CodeA、CodeB) があり、どちらも Table1 の同じフィールド Code を参照しています。Table1.Code フィールドに重複があります。
Entity Framework 6 で table-per-hierarchy アプローチを使用したいので、次のモデル クラスを作成しました。
次のように、 DataContext : DbContext クラスで table-per-hierarchy を定義しました。
問題は、そのようなマッピングを使用したい場合です - MyBaseClass の複合キーの一部として識別子フィールド (Table1.Abbrev) を使用できません - 次のエラーが発生します:
EntitySet 'DataContext.MyBaseClass' 内のすべてのオブジェクトには、一意の主キーが必要です。ただし、タイプ 'MyBaseClassA' のインスタンスとタイプ 'MyBaseClassB' のインスタンスはどちらも同じ主キー値 'EntitySet=MyBaseClass;Code=1' を持っています。
上記のモデルを Entity Framework 6 (またはそれ以降) にマップすることは可能ですか?
entity-framework - 複数の識別子に対する EntityFramework Table Per Hierarchy クエリ
ここにシナリオがあります -
複数のソーシャル サイト (Facebook、Twitter、G+ など) への投稿をサポートするアプリケーションがあります。
TPH を使用して、これをすべて 1 つのPosts
テーブルにまとめ、識別子の列を付けました。これらの「ソーシャル」投稿のそれぞれは、適切に呼ばれる共通の基本クラスから派生しますSocialPost
。
と言うだけで、 、、およびcontext.SocialPosts
の弁別子ですべてを取得するということでした。FacebookPost
TwitterPost
GooglePost
ここで、型の組み合わせを取得できるようにする必要があります。設定に基づいて、Facebook や Google の投稿などを処理するためにすべて引き戻し、Twitter はそのままにしておく必要があります。
1 つのクエリでそれを行う適切な方法はありますか?
次のコード
次のようなSQLを生成します
これは明らかに私が望むものではありません。Discriminator に二重フィルターを使用することが重要かどうかはわかりませんが、SQLを使用しているのは間違いありません。
それで、1回のクエリで複数の識別子タイプを取得する適切な方法はありますか、それともすべてを取得してSocialPosts
から、アプリケーション側で不要なものを除外する方がよいでしょうか。
c# - TPH を使用した Entity Framework のマルチレベル継承
特定の数のアイテムに対して TPH を実装するレガシー システムを使用しています。したがって、現在の構造は次のようになります
したがって、タイプ (T*) はすべてのテーブルの識別子ですが、特定のタイプは共通の列を共有するため、かなりの数の異なるテーブルがあります。問題は、これらすべての項目が実際には小さな共通点を共有していることですが、これらの項目すべてをコレクションに集める方法がないことです。実際には、階層は実際にはこのように見えるはずです。
したがって、本質的には、タイプごとの各テーブルが TPH である TPT です。実際の例として、必要なものは次のとおりです。
明らかに、初期設計にはいくつかの設計上の欠陥があり、3 つの異なるテーブルをクエリせずにすべての車両のリストを取得する必要があるとは誰も予想していませんでした。だから私の質問は、既存の構造で、この新しい階層をエンティティフレームワークに追加する方法があるということです。こんなことを考えていた
これは可能ですか?これらをエンティティ フレームワークにマップする方法はありますか? それらを正しく一致させることはできません。BoatId、PlaneId、および CarId を VehicleId ( Entity Framework の条件付きマッピング - または TPH での操作など) に置き換えるとうまくいく可能性がありますが、その時点で、実際にはそうではない非常に侵襲的なスキーマ変更を行うことになります。オプションであり、それが機能するかどうかはわかりません。基本的に、既存のキーを新しい階層にマップする方法が必要です。どんな助けでも大歓迎です。私は途方に暮れていて、私の質問に答える解決策が見つからないようです。
entity-framework - 複数のID列を挿入する階層ごとのEntity Frameworkテーブル
私は、データベース ファーストからコード ファーストへの TPH セットアップに真剣に 2 日間を費やしました。私が得るエラーは、「無効な列名Entity_EntityId / Entity_Entity_Id1」のようなものです
私は次のように問題の非常に基本的な再現を作成しました:
環境:
マッピング:
エンティティ:
テーブルに単一の「AnotherClassId」を持たせるにはどうすればよいですか?
c# - 階層ごとのEntity Frameworkテーブルがディスクリミネータを作成しない
いくつかの移行の後、継承階層を作成しました。コード ファーストの移行を使用してデータベースを更新すると、コード ファーストは識別子フィールドを自動的に作成しません。それ以来、テーブルを削除して再作成しました (コード ファーストの移行を使用して) 運がありません。私が考えることができる唯一のことは、派生クラスに追加の「非仮想」プロパティがないことです.継承構造は、特定の派生型のみが別のエンティティと関係を持つことができるというビジネスルールを強制するために作成されました.
ベースタイプ:
派生クラス (異なる/一意のスカラー プロパティなし):
別の派生型
派生クラス間に違いが見られないため (一意の「非仮想」プロパティがないため)、コードファーストはデータベースに識別子列を追加していませんか? もしそうなら、どうすればこれを回避できますか?そうでない場合、code-first がデータベースに識別子列を自動的に作成しない理由は何ですか? 想定どおりに機能する別の TPH 構造があります。
Dbコンテキスト:
また、各派生型に固有の「ダミー」プロパティを作成してみました。コードの移行により、新しいプロパティが列としてテーブルに追加されましたが、移行によって識別子列が作成されませんでした。