問題タブ [self-tracking-entities]
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# - linq クエリをオブジェクトとしてサーバーに送信する
次のようなlinqクエリがあります:
私の問題は、これらの種類のクエリをオブジェクトとしてサーバーに送信する方法です。ここで、私のlinqクエリは直接データアクセスです。データサーバーに送信する必要がありますが、オブジェクトが必要です。どうすればこれを実装できますか?
inheritance - クラスはEntity Frameworkクラスから継承し、継承されたクラスのマッピングを使用してDBに永続化できますか?
クラスはEntity Frameworkクラスから継承し、継承されたクラスのマッピングを使用してDBに永続化できますか? 「Self-Tracking Entity」クラスから派生しようとして SaveChanges を試行すると、Type にマッピングがないことを示すエラーが発生しました。Type が Entity クラスから継承されたので、これが機能するために何らかの形でエンティティ マッピングも継承できることを願っていました。これを機能させることができた人はいますか?
私がサポートしようとしているシナリオは、エンティティとマッピングを含むアセンブリを参照する別のアセンブリでエンティティ オブジェクトを拡張することです。パーシャル クラスとマッピングは、エンティティ オブジェクトを含むアセンブリにコンパイルされます。したがって、部分クラスを使用してこれを達成することはできません。
c# - WCF サービスを介して分離された自己追跡エンティティの非同期遅延読み込みナビゲーション プロパティ?
MVVM で構築された WPF アプリケーションに自己追跡エンティティを渡す WCF クライアントがあります。アプリケーション自体には動的インターフェースがあります。ユーザーは、自分の役割や実行しているタスクに応じて、作業領域に表示するオブジェクトを選択できます。
私の自己追跡エンティティにはかなりの数のナビゲーション プロパティがあり、それらの多くは必要ありません。これらのオブジェクトの一部は非常に大きくなる可能性があるため、これらのプロパティは要求があった場合にのみロードしたいと考えています。
私のアプリケーションは次のようになります。
[WCF] <---> [ClientSide Repository] <---> [ViewModel] <---> [View]
私のモデルは自己追跡エンティティです。クライアント側リポジトリは、要求元の ViewModel にモデルを返す前に、必要に応じて LazyLoad メソッドをフックします。すべての WCF サービス呼び出しは非同期です。つまり、LazyLoad メソッドも非同期です。
LazyLoad の実際の実装で問題が発生しています。ここに私が思いついたオプションがあります。
編集 - コードサンプルを削除して、これを読みやすく理解しやすくしました。見たい場合は、以前のバージョンの質問を参照してください
オプション A
Getter で WCF サーバーからモデルのプロパティを非同期的に LazyLoad する
良い:オンデマンドでのデータの読み込みは非常に簡単です。XAML のバインドによってデータが読み込まれるため、コントロールが画面上にある場合、データは非同期に読み込まれ、そこにあるときに UI に通知されます。そうでない場合、何もロードされません。たとえば<ItemsControl ItemsSource="{Binding CurrentConsumer.ConsumerDocuments}" />
、データをロードしますが、インターフェイスのドキュメント セクションが存在しない場合は何もロードされません。
悪い例:空のリストを返すため、このプロパティを開始する前に他のコードで使用することはできません。たとえば、ドキュメントが読み込まれていない場合、次の呼び出しは常に false を返します。
オプション B
必要に応じて手動で呼び出してデータをロードする
良い:実装が簡単 -メソッドLoadConsumerDocumentsSync()
とLoadConsumerDocumentsAsync()
メソッドを追加するだけ
悪い例: Bindings で使用する場合を含め、データにアクセスする前にデータをロードすることを忘れないでください。これは簡単に思えるかもしれませんが、すぐに手に負えなくなる可能性があります。たとえば、各 ConsumerDocument には UserCreated と UserLastModified があります。拡張機能、電子メール、チーム、ロールなどの追加のユーザー データを表示する ToolTip を使用して UserModel を定義する DataTemplate があります。そのため、ドキュメントを表示する ViewModel では、 を呼び出してからLoadDocuments
、それらをループして and を呼び出す必要がLoadConsumerModified
ありLoadConsumerCreated
ます。それも続くかもしれません...その後、私はしなければなりませLoadUserGroups
んLoadUserSupervisor
. また、 a のようなものがプロパティをUser
持ち、 aがプロパティを持つ循環ループのリスクを冒します。Groups[]
Group
Users[]
オプション C
これまでのところ私のお気に入りのオプションは... プロパティにアクセスする 2 つの方法を作成することです。1 つの同期と 1 つの非同期。バインドは Async プロパティに対して行われ、すべてのコードで Sync プロパティが使用されます。
良い:データは必要に応じて非同期に読み込まれます - まさに私が望むものです。これらの追加のプロパティ/メソッドを生成するために T4 テンプレートを変更するだけでよいため、追加のコーディングはそれほど多くありません。
悪い例:同じデータにアクセスする方法が 2 つあると、効率が悪く、混乱を招きます。Consumer.ConsumerDocumentsAsync
の代わりにいつ使用する必要があるかを覚えておく必要がありますConsumer.ConsumerDocumentsSync
。WCF サービス呼び出しが複数回実行される可能性もあります。これには、IsConsumerDocumentsLoaded などのすべてのナビゲーション プロパティに追加の IsLoaded プロパティが必要です。
オプション D
非同期ロードをスキップし、セッターですべてを同期的にロードします。
良い:非常にシンプルで、余分な作業は必要ありません
悪い:データの読み込み時に UI がロックされます。これはいらない。
オプション E
SOの誰かに、これを行う別の方法があることを教えてもらい、コードサンプルを教えてもらいます:)
その他の注意事項
一部の NavigationProperties は、オブジェクトをクライアントに返す前に WCF サーバーに読み込まれますが、それ以外はコストが高すぎてそれを行うことができません。
オプション C の Load イベントを手動で呼び出すことを除いて、これらはすべて T4 テンプレートを介して実行できるため、私が行うコーディングはほとんどありません。私がしなければならないことは、クライアント側のリポジトリで LazyLoad イベントをフックし、それを適切なサービス呼び出しに向けることだけです。
c# - 挿入または更新中のEntity Framework 4 InvalidOperationException
私は SelfTracking エンティティを使用しています。参照詳細テーブルにいくつかのフィールドを追加するまで、すべてが正常に機能していました。参照外部キーの何が問題なのかわかりません! 私はデータベース スキーマを設計していませんが、すべてがうまくいっていることがわかります。
スタックトレースを含む例外メッセージを次に示します。
この種のエラーに直面するのは初めてです。どんな助けでも感謝します。
ありがとうございました。
c# - N 層アプリケーションの Entity Framework Self Tracking エンティティ
これは一般的なアーキテクチャに関する質問です。できれば、最終的なアプリケーションで EF を既に使用している人々に向けて説明します。
典型的な N 層アプリケーションがあります。
- WPF クライアント
- WCF サービス
- EF STE DTOの
- EF データ層
アプリケーションは、ロード時に (ユーザーのログインと同時に) 既知のすべてのビジネス タイプをロードし、オンデマンドで非常に大きな「ワーク バッチ」をロードします。このバッチは約 4 ~ 8Mg で、1,000 を超えるビジネス オブジェクトで構成されています。この「バッチ」の読み込みが終了したら、すべてを以前に読み込まれたビジネス タイプなどにリンクします。
最終的に、メモリ内に約 2,000 ~ 5,000 のビジネス オブジェクトがすべて正しく参照されるため、クライアント側で LINQ を使用および悪用できます。また、クライアント側でこれらすべてのオブジェクトに対して複雑な計算を行うため、実際には大きなグラフが必要です。 .
問題は、変更をデータベースに保存するときに発生します。このような大きなオブジェクト グラフでは、ネットワークを介してすべてを再送信することはほとんどありません。
これまでの T4 テンプレートの複雑さを考えると、私が嫌いな現在のアプローチは、更新時にすべてをデタッチしてアタッチすることです。基本的に、特定のオブジェクトを更新し、グラフの残りの部分から切り離し、ネットワーク経由で送信し、WCF 側で更新してから、クライアント側で再度アタッチします。主な問題は、リンクされたオブジェクトを更新したい場合です。たとえば、追加されたものへの参照を持つものを追加し、次に変更されたものへの別の参照などを追加するとします。何も壊さないでください。
これはすべて生成されたコードで行われるため、テンプレートごとに 200 ~ 800 行の T4 コードについて話していることになります。
私が今検討しているのは、STE のシリアライゼーションとデシリアライゼーションをカスタマイズする方法です。これにより、ネットワーク経由で送信されるものと送信されないものを制御し、単一の STE だけでなくバッチを更新できるようになります。参照をチェックして、それらの参照が変更されていないかどうかを確認します。そうでない場合はシリアライズしないでください。はいの場合は、WCF 側のコンテキストにアタッチするだけで、すべてをシリアライズして更新します。
いくつかの研究の後、私はこの方法に対する2つの解決策を見つけました。
1 つは、カスタム DataContractSerializer を作成することです。
2 つ目は、EF によって作成された STE テンプレートを変更し、参照型ごとに生成する代わりに、KnownTypeAttribute をいじって、オブジェクトを検査し、変更されていないシリアル化参照のみをマークするメソッドを参照させることです。
- 誰もこの問題に遭遇したことがありますか?
- どのようなソリューションを使用しましたか?
- 途中でどのような問題に遭遇しましたか?
- 作成したテンプレートの維持はどのくらい簡単でしたか?
repository-pattern - EF 4.1 での ObjectContext と DbContext を使用したリポジトリ実装の違い
STEのより良い実装は何でしょうか.DbContextはEFでレポを実装する最も簡単な方法であると聞きました.個人的にはEntityStateを利用しています.レポ?今日、私はこのような GenericRepository を使用しています:
Unityも使用していることを忘れていたので、リポジトリへの呼び出しは次のようになります。
entity-framework-4 - エンティティ フレームワーク 4 POCO セルフ トラッキング
こんにちは、EF 4 でプロジェクトを開発しています。POCO セルフ トラッキングを実装しようとしていますが、wcf サービスを実装する必要がありますか? 変更がデータベースに保持されないため、エンティティの変更に問題があります。
前もって感謝します。
self-tracking-entities - STE を使用して子オブジェクトで ChangeTracking を有効にする
STE を使用しており、オブジェクトとその子の変更追跡を有効にしたいと考えています。私が今しなければならないことは、このようなことです。
私が探しているのは、子オブジェクトの変更追跡も自動的に有効にする方法です。それぞれをループして、変更の追跡を開始するように明示的に指示する必要はありません。
洞察をお寄せいただきありがとうございます。
.net - 更新ではなく追加を実行する自己追跡エンティティを停止する方法
この質問の長さについて事前にお詫び申し上げます。
次のエンティティ データ モデルが作成されたデータ構造があります (テーブル/フィールドは名前が変更され、理解しやすいように簡略化されています)。
PaymentMethod
/ProductPaymentMethod
構造体が存在するのは、 a が複数の利用可能なものを持つことができるためですCustomer
がPaymentMethods
、 per を使用するものを選択できるからProduct
です。
、およびはすべてCustomerReference
に基づいて生成されるため、最初の保存後に更新する必要があります。ProductReference
VendorReference
CustomerId
そのProductPaymentMethods
必要性はPaymentMethodIds
、最初の保存後に追加する必要があります。
ADO.NET Self-Tracking Entity Generator
が実行され、自己追跡コンテキストとオブジェクト クラスが生成されました。
次のように新しいエンティティを生成する BLLにCreateCustomer
メソッドがあります (疑似コード):
newCustomer
CreateCustomer
次に、これを行う DAL のメソッドに渡されます。
戻り値はCustomer
BLL 内の新しいオブジェクトに割り当てられ、参照は から生成され、CustomerId
追加されます。
を使用して作成するために、savedCustomer.PaymentMethod
コレクションがループされます。これが追加されます:List<ProductPaymentMethod> productPaymentMethods
PaymentMethodIds
newCustomer
UpdateCustomer
次に、これを行う DAL のメソッドに渡されます。
これはプレゼンテーション層に戻されます
これにより、作成されてから更新されたすべての複製が作成されました-2 x Customer
、2 x Product
、2 x Vendor
、4 x PaymentMethod
、4 x Currency
、および 4 xFrequency
レコードになります-UpdateCustomer
としてマークされたエンティティを受け取っていましたAdded
そのため、少し調査した後、呼び出す前に次を追加しましたUpdateCustomer
。
これにより、複製されたが停止しましたがCustomer
、まだ複製され、レコードが取得されていました。Product
Vendor
Currency
Frequency
PaymentMethod
私が思いついた解決策は、各コレクションをループし、呼び出す前に各エンティティを未変更としてマークすることでしたUpdateCustomer
:
Customer.PaymentMethods
(とについて繰り返すCustomer.Products.First().Frequencies
)
重複がなくなり、すべてのデータが作成されました。
最後に、私の質問に進みます!
ここで何かが欠けていると感じずにはいられません。リレーションシップ ツリーの各部分をチェックし、必要に応じてすべての更新の前に Modified または UnChanged としてマークする必要がありますか?
「自己追跡」という用語は、すべてが自動的に処理される必要があることを意味すると思いました。
これはEF / STEを使用する正しい方法ですか、それともより良い方法がありますか?
編集: 私の Visual Studio ソリューションに関するもう少しの情報。
DAL プロジェクト - CustomerModel.edmx、CustomerModel.Context.tt、CustomerDAL.cs
モデル プロジェクト - CustomerModel.tt
BLL プロジェクト - CustomerBLL.cs
WCF プロジェクト - CustomerWCF.svc.cs
テスト プロジェクト CustomerTest.cs
CustomerTest.cs は Private Accessor を使用して CustomerWCF.svc.cs を呼び出します
CustomerWCF.svc.cs が CustomerBLL.cs を呼び出す
CustomerBLL.cs が CustomerDAL.cs を呼び出す
DAL 参照モデル
BLL は DAL とモデルを参照します
サービス参照 BLL とモデル
テスト参照サービス、BLL、およびモデル
PrivateAccessor ではなく ServiceReference に対してテストする必要がありますか?
entity-framework-4 - エンティティフレームワークと自己追跡エンティティとPOCO
エンティティフレームワーク4をデータレイヤーとして使用し、エンティティをWCFまたは別のメカニズムを介して別の層に送信し、エンティティを更新して、更新/削除/挿入のために送り返す機能が必要な場合自己追跡エンティティまたはpocoオブジェクトを使用するのが最善ですか?
可能であれば他のレイヤーのエンティティフレームワークに依存したくないので、可能であればPOCOオブジェクトを使用したいのですが、POCOをコンテキストに再接続するのがどれほど難しいかわかりません。