問題タブ [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.

0 投票する
0 に答える
455 参照

entity-framework - Entity Frameworkコードで階層ごとのテーブルとタイプごとのテーブルを最初に既存のデータベースに混在させる

tl;dr : コード ファースト モデルを、オブジェクトの特定の階層が混合継​​承スキームを持つ既存のデータベースにマップしようとしています。一部の具象クラスは TPH を使用し、一部は TPT を使用します。マッピングを正しく取得できないようです。


既存のデータベースにマップしようとしているオブジェクトの階層があります。一部の具象クラスには追加のプロパティが含まれているため、独自のテーブルがあります。一部の具象クラスはそうではないため、ベース テーブルに存在し、識別子列に依存します。簡単にするために、POC を作成しました。データベース構造は次のようになります。

同等の POCO は次のようになります。

十分に単純に思えます。したがって、私の最初の試みは次のマッピングでした(流暢または属性を使用しても、結果は同じです):

しかし、それはうまくいきませんでした:

  1. テーブルにFooTpt.FooType記述子を作成したいFooTpts
  2. コマンドを実行しようとすると、次のエラーが表示されます (おそらく上記のポイント 1 が原因です)。

    (6,10) : エラー 3032: 6 行目から始まるフラグメントのマッピングの問題、11:EntityTypes ConsoleApplication1.FooTph、ConsoleApplication1.FooTpt がテーブル Foo の同じ行にマップされています。マッピング条件を使用して、これらのタイプがマップされる行を区別できます。


ふりだしに戻る。この回答は、親 (TPH) テーブルにマップされた中間抽象エンティティを作成することを提案しています。すべては、別の抽象化レイヤーでいつでも解決できますよね? だから私はいくつかの変更を加えます:

マッピングを変更します。

データベースは正常に表示され、親テーブルには単一の識別子があります。しかし、まだ何かが不足しており、同じエラーが発生します。

(6,10) : エラー 3032: 6 行目から始まるフラグメントのマッピングの問題、11:EntityTypes ConsoleApplication1.FooTph、ConsoleApplication1.FooTpt がテーブル Foo の同じ行にマップされています。マッピング条件を使用して、これらのタイプがマップされる行を区別できます。

すべてFooTptの s はFooTptBase定義上 である必要があり、これには が必要なため、これはあまり意味がありませんFooType == 2。(モデル ビルダーが私の中間FooTptBase抽象型を無視しているように見えますか?)

それで、私は何が欠けていますか?自分がやろうとしていることをどのように達成できますか?

0 投票する
1 に答える
365 参照

entity-framework - 循環的なparent_ID「タイプごとのテーブル」対「階層ごとのテーブル」対「クラスごとのテーブル」を防ぐ

Entity Framework で Table Per Hierarchy TPH を使用しています。これは基本的に、拡張データ型に共通のコア属性の部分クラスです。

2 つのオブジェクト/クラスがあります。と同じ基本プロパティを共有するCourseObject およびObject 。目標は、オブジェクトのいずれかで実行できるようにすることです。これをモデリングする際に助けが必要です。これはジェネリック型または継承型になりますか?StudentMyBaseCommonEntityService/ticket

私の質問: 親 ID を参照するために int を使用しています。テーブルの pK キーも int です。

  1. 循環参照を防ぐにはどうすればよいですか
  2. このチェックは設定中に行われますか
  3. Hierarchy id タイプはデフォルトでこの機能を提供しますか?
  4. タイプごとのテーブルと階層ごとのテーブルとクラスごとのテーブルの違いは何ですか`

    /li>
0 投票する
1 に答える
738 参照

c# - コードファースト、階層ごとのテーブルアプローチで列からモデルプロパティにマップするようにEntity Frameworkに指示する方法はありますか?

私たちはゼロから開発しているのでEntity Framework 6.1、MVCアプリケーションでcode-firstandtable-per-hierarchyアプローチを使用しており、この方法は迅速な開発に適していると考えています。しかし、ここで質問があります。1 つの基本クラスと 3 つのサブクラスがあるとします。これらは次のようになります。

既定の設定を使用する場合、EF はデータベース テーブルに 6 つの列を作成します: ID、名前、ボリューム、ボリューム 1、番号、ディスクリミネーター。Volume 列は SubClassOne にのみ使用され、Volume1 は SubClassTwo にのみ使用され、Number は SubClassThree にのみ使用されます。

データベースの行スペースの「無駄」についてはあまり気にしません。しかし、ここで私を悩ませていることが 1 つあります。私が新しい開発者で、データベースを直接見ている場合、「Volume」と「Volume1」の名前に混乱してしまいます。コード側には SubClassOne と SubClassTwo があり、どちらにも「Volume」という名前のプロパティがあることを知っています。しかし、どの列がどのクラスのものかはわかりませんでした。だから私の質問は、データベース内の列にSubClassOne.Volumeとの両方SubClassTwo.Volumeがマップされていることを Entity Framework (たとえば、属性を使用して) に指示する方法はありますか? Volume(別の利点は、1 つの列を減らすことですが、それは私の主な目標ではありません)。

Entity Framework、code-first、または table-per-hierarchy を使用せず、テーブル、特に DAL を自分で設計すれば、完全に制御してこれを達成できると思います。しかし、今はどうですか?

0 投票する
3 に答える
143 参照

c# - Entity Framework:- クラスを派生させるためにキャストするとエラーが発生し、階層クエリごとにテーブルで例外がスローされる

派生クラスにキャストしようとすると例外が発生しました。タイプ '' をタイプ '' にキャストできません。LINQ to Entities は、EDM プリミティブ型または列挙型のキャストのみをサポートします。

0 投票する
1 に答える
714 参照

c# - Data Annotation で Entity Framework TPH Discriminator 列を作成する

Data Annotation で Discriminator 列を作成したいと考えています。

Fluentによるマッピング

とにかく、選択結果に識別子列の値が必要です

0 投票する
0 に答える
552 参照

c# - EF-TPHクラスで選択クエリを書く方法

EF-6 mvc5 プロジェクトに取り組みます。階層クラスごとのテーブルの問題に直面します。私のクラス構造は次のとおりです。

ここに画像の説明を入力

上の図は、詳細なクラス関係を示しています。

部屋、およびそこに関連するデバイスをデバイスタイプで選択できる選択クエリを作成したいので、次のクエリを作成しますが、機能しません。

上記のクエリでは、「インクルード パス式は、型で定義されたナビゲーション プロパティを参照する必要があります。参照ナビゲーション プロパティには点線パスを使用し、コレクション ナビゲーション プロパティには Select 演算子を使用してください。パラメータ名: パス」というエラーメッセージが表示されます。その中のナビゲーション プロパティを作成する方法。

このシナリオでは、select クエリの書き方を説明します。

0 投票する
0 に答える
427 参照

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 がどのような仮定を行っているかを誰かが説明できますか?

0 投票する
0 に答える
467 参照

c# - 階層ごとの Entity Framework テーブルと 1 対 1 の関係

EF 6 コード ファーストおよび SQL サーバーで、階層ごとのテーブル アーキテクチャを 1 対 1 の関係と組み合わせて実装する際に問題があります。Entity Framework は、右側の列を外部キーとして使用しません。

クラスVersionと 2 つの継承クラスProductVersionがありFeatureVersionます。

2 つの継承クラスは、ナビゲーション プロパティのみを実装します。

現在、私の製品では 1 対多の関係を使用しており、すべて正常に動作しています。

私の機能では、1 対 1 の関係を使用していますが、問題が発生します。

結果の移行は次のようになります

ご覧のとおり、機能への外部キーは間違った列を使用しています。

t => t.ID手動で外部キーに変更するとt => t.FeatureId, cascadeDelete: true、データベースに正しく挿入されますが、EF ではイニシャルFeatureVersion;で新しい機能を挿入する際に問題があるようです。newFeatureVersionFeatureId列は常に 0 に設定されるため、例外が発生します (コードでは、単に新しいFeatureVersionオブジェクトを Feature オブジェクトに割り当て、コンテキストの変更を保存しようとします)。1 対多の関係を持つ Product では、すべてが正常に機能します。

興味深いことに、Feature の参照を

たとえば、マザー クラスでは、すべて正常に動作します。移行では、正しい列が結合されていることがわかり、INSERT も機能します。しかし、間違いなく、これは私が望むものではありません。

継承はどういうわけかEFを苛立たせていますか?私は重要な点を見逃していますか?

FeatureVersionまた、 for と同じように、 for を 1対多の関係に変更しようとしましたProduct。正常に動作しますが、これは私が使用する必要がある関係ではありません。