問題タブ [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.
.net - Entity Framework 6 と TPH の継承: 同じ名前のプロパティを既定で同じ列にマップする
EF6 では、Table Per Hierarchy 継承を使用してエンティティ マッピングを構成するときに、次のようなことが可能です。
BatteryLevel
基本クラスの一部ではありませんDevice
。インターフェイス コントラクトを満たすために実装された派生クラスのプロパティです。
派生クラスごとに新しいマッピングを追加するのではなく、これをデフォルトの動作にすることは可能ですか?
c# - サブタイプ間の関係を作成しようとすると、EF-Migrations FK エラーが発生する
私のドメイン モデルには、Company
抽象化された基本クラスと、Company のサブクラスによって表される 3 つの異なる Company タイプがあります。
同様に、Funds Account を定義する別の基本クラスと、特定のプロパティを実装する 2 つのサブタイプがあります。
これらの型に対する私のマッピング戦略は、階層ごとのテーブルであるため、私の DbContext クラスでは、基本クラスに対してのみ DbSet を定義します。これにより、ポリモーフィック クエリと非ポリモーフィック クエリの両方を実行できるようになります。
ここでトリッキーな部分が来ます。私の要件は次のように述べています。
- サプライヤーは資金口座を持ってはなりません
- ディーラーには DealerFundsAccount が必要です
- 小売業者には RetailerFundsAccount が必要です
次のように単純なはずです。
しかし、EF Migrations はデータベース スキーマを更新しようとして惨めに失敗します。TPH により、Dealers と Retailers は同じ Company データベース テーブルにマップされ、RetailerFundsAccounts と DealerFundsAccounts は FundsAccount db テーブルにマップされます。これはすべて望ましいことですが、サブタイプ間に 2 つの 1 対 1 の関係を定義したため、EFはFundsAccount Id フィールドに外部キーを 2 回定義します。
資金口座を持つ Company テーブルごとに 1 対多の関係を定義し、FK の一意の制約を使用して 1 対多の動作を防止することで、ソリューションをハックできることはわかっていますが、より良い解決策があります。
c# - EF6 - 基本クラス プロパティを使用した派生クラスでの TPH 外部キー マッピング
タグが次のような単一のテーブルに格納されている既存のデータベースで Entity Framework 6.0.2 を使用しています。
Id
: int、主キーTagType
: 文字列。タグのタイプを決定します。「usertag」または「movietag」のいずれかです。ItemId
: int。参照先のアイテムの ID (ユーザー ID またはムービー ID) が含まれます。
次のクラスは、この状況を説明しています。
ご覧のとおり、派生クラスにはナビゲーション プロパティがありItemId
、基本クラスのプロパティの値に基づいています。私のマッピングは次のとおりです。
次のコードを使用してこのマッピングを使用しようとすると、例外が発生します。
スローされる例外は次のとおりです。
Unhandled Exception: System.InvalidOperationException: The foreign key component 'ItemId' is not a declared property on type 'UserTag'. Verify that it has not been explicitly excluded from the model and that it is a valid primitive property
はい、ItemId
プロパティは type で宣言されていませんが、基本クラスUserTag
から継承されています。Tag
私には、このマッピングが可能であるように思われます。これは Entity Framework 6 のバグまたは制限ですか?
java - 休止状態でテーブルごとの階層で具象クラスのすべてのオブジェクトを取得する方法は?
Spring MVC と Hibernate を使用して、Netbeans (Maven Web Application) で Web アプリケーションを開発しています。複数の具体的なクラス (親、子など) を持つ抽象クラス (ユーザー) があります。これらの具象クラスのすべてのオブジェクトを含む 1 つのテーブルができるように、階層ごとのテーブル構成を選択しました。しかし、特定の具象クラスのすべてのオブジェクトを取得する方法が見つかりません。次のエラーが表示されます。
java.lang.IllegalArgumentException: TypedQuery [domain.Parent] に指定された型は、クエリの戻り値の型 [class domain.User] と互換性がありません
これらのオブジェクトをキャストする方法を知っている人はいますか?
c# - フィールド値に基づいて具象クラスを自動的に作成する方法
次の例を検討してください。
データベース (Stackoverflow に似ています) には、同じテーブル内に質問と回答をPostType
フィールドで区別できるテーブルがあります。質問でも回答でも、最新の投稿のリストを取得したいと思います。
質問と回答は共通のプロパティを共有するため、両方のクラスが抽象クラスを継承しContentBase
ます。各タイプに関連するフィールドをいくつか追加するだけです。
IList<ContentBase>
個々のアイテムが具体的なタイプであるQuestion
かAnswer
、基準フィールドに基づいている場合に、キャスト先のコンテンツ アイテムのリストを取得するにはどうすればよいですか。
私のリポジトリには次の呼び出しがあります。
私は PetaPoco/NPoco を使用していますが、Dapper を使用した場合も同じ問題が発生すると思います。
質問
ContentType
特定のフィールドの値 (この場合) に基づいて正しい具象型をインスタンス化するように DAL に指示するにはどうすればよいですか?
説明
私はこれらの行に沿って何かをする必要があります:
しかしContentBase
、抽象クラスなのでできません。この行を次のように変更すると:
InvalidOperationException
NPoco からCan't auto join Userというメッセージが表示されるため、まだ機能しません。
これを行う唯一の方法は、継承された新しいクラスを作成し、デリゲートPocoData
の独自の実装を提供することだと思います。おもう。具体的な POCO がインスタンス化される拡張ポイントは他にないと思います。抽象祖先クラスを処理しているため、この方法で行うべきかどうか、どのように行うべきかわかりません。GetFactory
mysql - GRAILS: ドメイン サブクラスの使用
次のバージョンで Grails を使用します。
従おうとしているドメイン モデルがあります。プログラミングの前に、MySQL でテーブルを作成しました。
モデルには、多対多の関係で人 (Persons) にバインドされた Insertion_orders があります。この関係は Insertion_orders_persons によって定義され、person_id と location_id によって Insertion_orders_persons のエントリが定義されます。さらに、Trafficker、Advertiser、Agency、(または) Salesperson のいずれかが ENUM 化された type 値があります。常に 1 人 (または複数) のトラフィッカーが表示されますが、残りのトラフィッカーは、これらの関連付けの多くを持っている場合と、持っていない場合があります。タイプに応じて Insertion_orders モデルにバインドしようとしています。
これを達成するために、継承と識別値を使用しようとしています。
問題は、拡張クラス (Insertion_orders クラスの hasMany など) に参加しようとすると、Grails が起動に失敗し、次のように生成されることです。
追加情報として、サブクラスまたはサブクラスの構成にどのようにアクセスしようとしても、同じエラーが発生します。
これは非常に基本的な機能のようです。誰かが私が見逃していることや間違っていることを教えてもらえますか?