0

WCFサービスを公開するアプリケーションを開発しています。DALでEntityFramework4.1を使用しています。問題は、エンティティをロードするときです(たとえば、Orderを持っている顧客がOrderDetailを持っているとします)。ロードした後、Customer、Order、およびOrde​​rDetailオブジェクトにいくつかの変更を加え(いくつかの新しい注文が追加され、いくつかの既存の注文が削除/更新されます)、オブジェクトグラフをWCFサービスに送信して次のように更新します。

Customer oCustomer;
using(var context = new MyContext) //MyContext is dbContext
{
    oCustomer = context.Include("Order.OrderDetail").Find(1);
}

oCustomer.Name ="blah blah";
Order oOrder1 = oCustomer.Order.Where(obj=>obj.Id == 2);
oOrder1.Description = "blah blah";
oOrder1.OrderDetail.Quantity = 10;

Order oOrder2 = new Order { ... } //properties of Order are set.
oCustomer.Order.Add(oOrder2);

oCustomer.Order.Remove(context.Order.Find(1));

ServiceClient client = new ServiceClient();
client.SaveCustomer(oCustomer);

サーバー側で更新された顧客のObjectGraphを受け取ったとき、現在変更追跡がないため、どの注文が削除され、どの注文が変更されたかわかりません。どの順序を削除し、どの順序を変更するかをどのように判断できますか?Entity Framework 4.1でオブジェクトグラフの変更を追跡する方法はありますか?

注:以前は、この問題を解決するセルフトラッキングエンティティを使用していましたが、WCFサービスがJavaクライアントアプリでも使用されるため、STEを削除する必要がありました。したがって、STEは私にとってオプションではありません。

4

2 に答える 2

3

答えを読んでいないように見えるので、質問に答えることに意味があるのだろうか。

あなたはSTE について質問し、その使いやすさについて回答を得ました。

  • 相互運用可能なシナリオではないことが明示的に記載されているリンクを追加しました
  • Richard は、STE とカスタム変更追跡に関する非常に優れたリンクを投稿しました。それはまさにあなたが今探しているものです

STE を使用した後、Java クライアントで STE を使用する方法について質問したため、これらの回答を読んでいない可能性があります。

STE と EFv4.1 についてのあなた自身の質問を複製したことにさらに驚かされます

今日、あなたはすでに別のあなたの質問でこの質問に対する答えを得ています.

それで、あなたはどんな答えを期待しますか?回答を読まない場合、質問に回答する価値はありますか?

答え:

DbContext 用の STE テンプレートはありません。また、STE を使用していない場合は、変更の追跡を完全に自分で処理する必要があります。これは、EF が役に立たないためです。最も簡単な方法は、前の質問で説明されています。オブジェクト グラフをサービスに再度読み込み、着信グラフを接続されたエンティティにマージして、コンテキストが変更を追跡できるようにします。より複雑な解決策は、STE に関する以前の質問の 1 つで提供された @Richard のリンクに記載されています。転送された各エンティティにいくつかの状態プロパティを追加する必要があり、クライアントはそれらを正しく設定して、手動で正しく設定できるように返信する必要があります。エンティティをアタッチすると、各エンティティの状態が表示されます。関係がある場合、これは少し複雑になる可能性があります。

于 2011-08-10T17:48:18.973 に答える
2

知る限り、自己追跡エンティティ (あなたが言うように使用できない) を除いて、切り離されたオブジェクト グラフの変更を追跡する方法はありません。

切り離されたグラフを更新するために通常行うことは、元のグラフをデータベースから再読み込みし、元のグラフと変更されたグラフ (ケースバイケースの手書きコード) を比較して、追加、変更、および削除されたエンティティを確認し、変更を書き込むことです。オリジナルに変換し、コンテキストを保存します。

この手順の例 (顧客と注文のコレクションなど、1 つの親と子のコレクションの場合) は、次の質問への回答にあります

エンティティのより深い階層を処理する必要がある場合、残念ながら非常に複雑になります。私が見る限り、EF は、変更されたグラフを元のグラフに自動的にマージする機能を提供していません。これは、エンティティが変更されたスカラーおよび複雑なプロパティのみを持つ非常に単純な場合のみです。ナビゲーション プロパティが関係するとすぐに、EF からのサポートがなくなり、更新ロジックを自分で作成する必要があります。

于 2011-08-10T17:47:29.787 に答える