問題タブ [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# - asp.net の親子階層
asp.net で家族の階層を表示したい。
属性 ParentID、ChildID、Name を持つ Family としてテーブルがあります。テーブルには、ParentID と ChildID の seft 結合があります。データベースからのデータを表示する方法。階層レベルは固定されていません。
#編集済み
aspx パーツにこの階層ツリーを表示させたい。つまり、reapeater やその他のコントロールを使用してこのツリーを aspx に表示する方法。
c# - Entity Framework Code First - 子 TPH クラスのタイプに基づいて選択
私は現在、階層ごとのテーブルを使用して単一のテーブルを使用してクラスの 1 つのセットを表すプロジェクトで Entity Framework 4 を使用しています。これが機能する方法は、このテーブルが状態を表し、さまざまな状態がさまざまな他のクラスに関連付けられていることです。
したがって、すべての州が共有する共通のフィールドを無視すると、次のように見えると想像できます。
各状態には、それに属するすべての InventoryItems のコレクションがあります。
現在、インベントリ内の各アイテムには多くの状態があり、履歴の最後のものが現在の状態です。リストに保存するために、インベントリの現在の状態を指すショートカット フィールドがあります。
私が抱えている最初の問題は、たとえば、Active
状態にあるすべての InventoryItems を見つけたいときです。
Linq-To-Entities は GetType() をサポートしていないことが判明したため、 のようなステートメントは使用できませんInventoryRepository.Get().Where( x => x.LastState.GetType() == someType )
。演算子を使用できis
ますが、次のようなメソッドを持つことができるのではなく、固定型が必要です。
Linq クエリを作成する前に、型に基づいて何らかの if ステートメントを実行する必要がありますが、これは間違っていると感じています。InventoryItem リストは大きくなる可能性が高いため、これを EF レベルで行う必要があります。たとえば、リスト全体をメモリに取り込んで GetType() を使用することはできません。
この状況で 2 つの質問がありますが、これらはおそらく私の側の理解不足を反映しているため、組み合わせることができるほど密接に関連していると思います。
- Linq To Entities を使用して、子テーブル タイプを共有するアイテムのリストを見つけることは可能ですか?
- 遅延読み込みを使用していない
Include
場合、TPH を使用して子テーブル タイプのアイテムを関連付けることは可能ですか?
c# - Entity Framework Code First TPH 継承 - 異なる子クラスでフィールドを共有できますか?
Entity Framework Code First を使用して作成された Entity Framework Model があります。これは、Table Per Hierarchy 継承を使用しており、構造は次のようになります。
今、それが作成するものは、私が持っていて保存しているBaseStates
テーブルにあります。しかし、クラスが aと an の両方になることは決してないことを考えると、両方に単一を使用するのが論理的であるように思われます。これにより、データベースの追跡も容易になります。Owner_Id
Owner_Id1
CreatedState
UpdatedState
Owner_Id
私の基本的な質問は、これは Code First EF4 で可能ですか?
列をマップしようとしました:
それは効果がないように見えました。
次に、共有の親クラスを作成しようとしましたが、これはおそらくより正しいオブジェクト指向です。
繰り返しますが、サイコロはありません。または、もっと心配なことに、これが機能するクラス間に正確な違いが見られない場合、これは機能する場合と機能しない場合があります (明らかに私の実際の構成はもう少し複雑です)。
何が失敗したかの詳細については、編集してください。上記のように動作する 2 つのフィールドがあります。関連するクラスOwnedState
とを呼び出すことができますActivityState
。どちらも、最後の例で示した方法で抽象クラスとして作成しました。OwnedState
そこから派生する 2 つのクラスがあり、ActivityState
3 つのクラスがあります。私が持っているデータベースではActivityState_Id
、OwnedState_Id
とOwnedState_Id1
.
OwnedState
クラスとクラスの間には、それらが参照するタイプ(両方の他のエンティティ)を除いてまったく違いはActivityState
ありませんが、データベースでは、EFが何らかの形でそれらを異なる方法で解釈したように見えます-EFの内部を十分に理解していませんそれがどのようにその決定を下すかを知っています。
c# - Entity Framework: 階層ごとのテーブルは、この状況に適した継承パターンですか?
Entity Framework 4.1 データ ストアに格納したいオブジェクトの階層があるとします。Code First を使用して作成しています。それらは次のようになります。
はBasicState
他のすべての状態の親であり、他のすべてはこれら 2 つのフィールド/関係を共有します。
私の最初の考え、およびこれを実装した方法は、Table Per Hierarchy 継承を使用することでした。なぜならBasicState
、これらの共通プロパティから継承して、他の状態に参加させることができるように思われたからです。
ただし、異なる状態がフィールドを共有する場合、基礎となるデータ モデルは共有しないため、問題が発生しました。たとえば、私のデータベースはEntityLocation_Id
一方からReceivedState
と他方ApprovedState
からのものEntityLocation_Id1
です。どのフィールドがどのモデルに属しているかがわからないため、テスト データを作成するのが難しくなります。これについては以前質問しました。
私が行った解決策は、次のようなものでした。
これは部分的に機能しましたが、単一のものを作成しましたが、同じように動作し、実装は区別できませんが、とのEntityLocation_Id
2 つOrder_Ids
を作成しました。OrderedState
DispatchedState
そのほとんど半分が解決されたので、私はこの質問をするように導く別の問題にぶつかりました:
BasicState
との関係がStatefulEntities
両方向で多対多であることを考えるとOrderedStates
、 a に属するから注文の詳細を見つけることができる必要がありStatefulEntity
ます。
BasicState
問題は、これは SQL で表現するのは非常に簡単ですが、関連する継承は、Entity Framework が指定された が であるかどうかを認識しないことを意味するOrderedState
ため、データベースへの単一のトリップを実行して を含める方法がないように見えることOrderedState.Order
です。
だから私ができないことは次のようなものです:
明らかに、それは実行されるコードではありませんが、問題が何であるかを示しています. Order は特定のサブタイプにのみ属しているBasicState
ため、何らかのキャストを使用している場合でも、EF はそれをプリロードしません。
投影を試みると、次のようなものが得られます。
しかし、プロジェクションによって返された匿名型から StatefulEntity に戻る方法を見つけて、コードの残りの部分がそれを処理できるようにする必要があることがわかりました。
私は基本クラスと継承者を次のように定義しようとしています:
などなどですが、そもそも TPH を使用するという基本的なポイントを破っているように見え、ジェネリック データ クラスに独自のオブジェクト モデルを転がしているような気がします。
編集:私はこれについてもう少し理解していると思います-その関係(つまり、 Location と LocationState の間の関係)の遠端に ForeignKey を設定しようとすると、 Order または Location の逆コレクションができるように見えますベース オブジェクトにないプロパティと対話しないため、上記のバージョンを使用する必要があります。これにより、EntityLocationId または OrderId を持たないケースを管理する方法に新しい問題が生じます。これらのフィールドを null 可能にすると、データベースの作成中に参照フィールドを null にできないというエラーが発生し、デフォルトでは、 Code First のフィールド。
Entity Framework で動作するこのタイプのモデルを表現するより良い方法を推奨できる人はいますか?
c# - Entity Framework 4:一見単純なクエリでの動的プロキシ エラー?
POCO Entity Framework アプリケーションで作成している Linq To Entities クエリがあります。これは次のようになります。
これOfType
は、State エンティティが Table Per Hierarchy 継承を使用するためです。OrderedState
とその子のみがOrder
プロパティを使用できます。
ただし、実行すると、次のエラーが発生します。
タイプ 'System.Data.Entity.DynamicProxies.OrderedState_6F372135E57CB68DDA1A42541A941E1F0848887EABD8BD4833D0159C9D8B055F' のオブジェクトは、タイプ My.NameSpace.Entities.OrderedState' のオブジェクトを含む EntityCollection に追加、アタッチ、または削除できません。
これは、私が興味を持っている共通のプロパティをOrderedState
継承して共有するという事実によって、EntityFramework が混乱しているためですか? OrderState
Linq ステートメントからを削除すると.Include(x => x.Order)
、エラーは回避されますが、この State に関連する Order 自体は、その値を正確に取得することが目的の場合に null として返されます。
編集: より多くの調査により、さらに奇妙なことが起こっていることに気付きました。私の TPH 継承階層は次のようになります。
したがって、シークするOrderedState
と、OrderedState または A DispatchedState のいずれかになりますが、私が興味を持っているのはOrder
プロパティの読み込みです。これは、BaseState オブジェクトの型指定されていないリストがある場合は実行できません。
私が今気付いているのは、.Include( x => x.Order)
Entity Framework が型引数を無視する場合です。シード データを微調整し、このタイプのエラー メッセージが表示され始めたので、これはより明確になりました。
タイプ 'System.Data.Entity.DynamicProxies.ReceivedState_6F372135E57CB68DDA1A42541A941E1F0848887EABD8BD4833D0159C9D8B055F' のオブジェクトは、タイプ My.NameSpace.Entities.OrderedState のオブジェクトを含む EntityCollection に追加、添付、または削除できません。
私はこれに驚いたので、型を強化しようと思いました:
案の定、Order
プロパティを含めようとしないと、OrderedStates のみが返されます。Include
意図的に返さないようにしようとしている型を返すことができないため、使用するとすぐに例外が発生します。私が照会している Id は間違いなく OrderedState の ID です。実際、私が呼び出しているメソッドは、この問題を防ぐかどうかを確認するためのテストとして、まだ OrderedState オブジェクトのみを受け入れます。
私の目標は、この型付き要素のみが持つ子プロパティを含む、TPH テーブルから単一の型付き要素を取得することです。
c# - 階層プロジェクションユニオンごとのC#テーブル
モデルクラスに投影するために、階層ごとのテーブルを使用しています。Linq to Entities で型を使用すると、すべての結果は常に射影された最後の型になります。私が意味するのは、ドメインモデルにこれらがある場合です:
そして、名前とタイプの列を持つ Person テーブルがあり、階層ごとにテーブルを使用して特定のエンティティ (EmployeeEntity および ManagerEntity と呼びます) を生成します。
このコードを使用すると:
ProjectedPeople 内のすべてのタイプのオブジェクトは Employee であり、タイプ Manager である必要があるオブジェクトも含まれます。Concat 呼び出しを削除して個別に実行すると、正しいタイプ (マネージャーまたは従業員) が返されます。
ここで何が間違っていますか?オブジェクトのダミー リストを作成し、それらに対して AsQueryable を呼び出し、続いてプロジェクションを実行することで、方程式から Linq を削除するテスト コードをいくつか書きましたが、それは正常に機能しました。
entity-framework - Entity Framework: TPC 階層における 1 対 1 の問題
次のような TPC 階層があります。
次に、コードを実行し、EF がテーブル (Sub1 と Sub2) を作成します。ただし、EF はテーブル Sub1 の追加の外部キーを作成します。外部キーとして Sub1 のキーを使用しません。Vender_BaseId という名前の追加の FK を生成します。
entity-framework - 外部キーをTPHの子に移動するEntity Frameworkの継承
エンティティ モデル内で階層ごとの継承を使用しており、外部キーを介して他のテーブルへの関係を含む親テーブルがあります。
私の親テーブル (製品) には、EF でナビゲーション プロパティに解決される別のテーブルへの FK リレーションシップがあります。そのナビゲーション プロパティを子テーブル (Fragrance) に簡単に移動して、親テーブルから削除できます。ただし、外部キー プロパティ (FragranceId) も子に移動したいのですが、FK 関係では親テーブルにそのプロパティが必要なため、これを行う方法がわかりません。
下の図は、私がどこまで到達したかを示しています。基本的に、私がやろうとしているのは FragranceId を Perfume エンティティに移動することです。
これは可能であるように思われますが、Perfume はテーブルではないため、データベースの関係を引き継ぐことはできず、その関係が Fragrance と Property の間に存在する間は、Product から FragranceId を削除できません。
FragranceId を移動すると、EF エラー「Role Product によって参照される型で定義された FragranceId という名前のプロパティがありません」が発生します。
フレグランスと香水は1対1の関係。
どんな助けでも素晴らしいでしょう。ありがとう。