問題タブ [tph]
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.
entity-framework - 必要な列を実装していない型に対して、必要な TPH 列に Null 挿入を回避する方法
TPH 継承を利用する一連のクラスを取得しました。
したがって、すべてのタイプが「ドキュメント」テーブルにあります。
一部のドキュメント タイプには固有のフィールドがあります。サブドキュメント タイプに null を許可しないフィールドがある場合、エンティティの作成時に他のタイプでエラーが発生します。これは、EF が DB のその列に NULL を挿入しようとするためです。サブタイプはその列を認識していないためです。
移行で defaultValue を使用してデフォルトをゼロにしようとしましたが、同じ結果が得られました。
基本型にそのフィールドがまったくない場合、継承された型にnull不可のフィールドを持つことは可能ですか?
または、常に「列 x に値 Null を挿入できません」というエラーが発生しますか?
この場合、列は列挙型です。
null 可能にして、他の方法で強制する必要がありますか?
c# - EF TPH で継承された型のプロパティを照会できません
efバージョン 6.1.3 および Unity リポジトリを使用して asp.net mvc5で作業します。SmartDevice の基本タイプとSmartRainbow、SmartRouter、SmartSwitchの3 つの派生タイプを持つモデルがあるとします。以下のように:
コンストラクターには以下の構文があります
スマートデバイス
スマートスイッチ
スマートレインボー
SmartDeviceをクエリすることで、構文が次のすべてのエンティティを取得します。
問題は、上記の結果のすべてのエンティティがSmartRainbowまたはSmartRouterまたはSmartSwitchのタイプになることです。単一の継承されたタイプ プロパティとナビゲーション プロパティをロードできません。
以下の構文を使用して、ナビゲーション プロパティの読み込みに失敗しました
- SmartSwitchプロパティチャネルを読み込めませんか?
- OfTypeメソッドの後にincludeを使用できませんか?
- OfTypeの後にincludeできないのはなぜですか?
c# - EF6 で Table-Per-Hierarchy (TPH) マッピング戦略が使用されている場合、親エンティティに派生クラスを持つ複数のコレクションが機能しない
私はこれを理解しようとして、週末の大部分を費やしました。
TPH 継承戦略を使用してドメイン内のエンティティにマップするサブスクリプション テーブルを含む既存のデータベースがあります。
サブスクリプションにはいくつかの種類があり、それぞれに独自の特性があるため、継承が必要です。これは、ドメインの単純化されたバージョンです。
これらのエンティティは、コンテキストで次のようにマップされます。
予想どおり、いずれかの派生クラスに対してコンテキストがクエリされると、EF は ServiceTypeId を識別子として使用してクエリを正しく構築します。Customer エンティティに派生クラスを含めようとすると、問題が発生します。これは機能します:
これは動作しません:
これもありません:
プロファイラーを確認すると、これらのシナリオの両方で、EF が _id サフィックスを追加し、customerID に加えて存在しない customer_id 列を照会しようとしていることがわかります。派生型の外部キーを明示的にマップしようとしましたが、EF は次のように不平を言っていました。
外部キー コンポーネント 'CustomerID' は、タイプ 'TVSubscription' で宣言されたプロパティではありません。モデルから明示的に除外されていないこと、および有効なプリミティブ プロパティであることを確認してください。
CustomerID は派生クラスにはありませんが、そこに移動しようとしても機能しませんでした (EF が別の継承戦略でマップしようとしたためと思われます)。
今、私はこのようなもので行くことができることを理解しています:
ただし、このアプローチでは、EF は db に対してサブスクリプションのセット全体をクエリし、ローカルでフィルター処理して TVSubscriptions のみを返します。Customer は何百ものサブスクリプションを持つことができるため、これは確かに理想的ではありません。できれば、dbContext を使用する場合と同様に、特定の種類のサブスクリプションのみを EF にクエリして返すようにしたいと考えています。
問題は、どうすれば TVSubscriptions のリストを Customer クラスに含めて、それらのみに対して EF クエリを実行できるかということです。
これが不可能な場合は、派生クラスのコレクションを Customer エンティティに追加するときに EF がどのような仮定を行っているかを誰かが説明できますか?
c# - TPH での EF インクルードの使用
THP を使用して、単純な継承を使用してコード ファーストの db アーキテクチャを実装しました。
そして、すべてのタイプのすべての通知を照会する必要があります。
テーブルのTargetUser
プロパティは関連付けです。NotificationUser
次のコードを実行しようとしています:
データベースのプロパティTargetUser
は外部キーを修正するように設定されていますが、コードでは結果が得られません。遅延読み込みが有効になっています。
ユーザーの熱心な読み込みは可能ですか? 私はすでに_context.Notifications.Include('TargetUser')
バイトを書き込もうとしましたが、例外がスローされました。
更新。例外は次のとおりです。
この回答を次のように変更しようとしました:
それでも同じ例外がスローされます。
c# - Entity Framework Code First Two navigationProperty to/from one abstract entity
次のエンティティは、PersonParameter が抽象クラスであり、Shirt と Shoes が typ(1,2) で継承される最初のコードです。
およびモデル dbcontext の場合
ただし、上記のコードは Person テーブルに不要なフィールド PersonParameter_id を作成します。
どうすれば解決できますか (PersonParameter_id) HasOptional.WithMany で FluentApi を実行しましたが、解決しませんでした。
EDIT
いくつかのテストの後、非抽象クラスでも追加のIDが作成されることがわかりました。その問題を修正するための1つの解決策は、パラメータークラスからナビゲーションプロパティを削除し、継承クラス(シャツと靴)に追加することです