2

問題なく動作する EF5 WPF/MVVM ソリューションがあります。このプロジェクトは注文入力システムですが、注文をロードすると多くの関連アイテムがロードされるため、コンテキストを使用してすべての変更を追跡し、それを保存するため、コンテキストは長く存続します。ユーザー A が注文を読み込んで何もせず、ユーザー B がその注文を読み込んで更新した場合、ユーザー A が古いデータを更新できるようにするための更新ボタンがあります。残念ながら、EF5 にキャッシュを無視させることはできないようです。私はもともとこれがうまくいくと思っていました:

   _trackingContext.GetObjectContext().Refresh(RefreshMode.StoreWins, theOrders);
   List<OrderLineItem> line_items = theOrders.SelectMany(x => x.OrderLineItems).ToList();
   _trackingContext.GetObjectContext().Refresh(RefreshMode.StoreWins, line_items);

GetObjectContext() は単なるラッパーです

public ObjectContext GetObjectContext()
{
    return (this as IObjectContextAdapter).ObjectContext;
}

これはデータを更新しないことが判明しました。だから、Mergeオプションを変更する必要があるかもしれないと思ったので、追加しました

var set = _trackingContext.GetObjectContext().CreateObjectSet<OrderLineItem>();
set.MergeOption = MergeOption.OverwriteChanges;

また、注文に対して(およびPreserveChangesオプションを使用して)試しましたが、何も機能しませんでした。最終的に、コンテキストを破棄して再作成し、検索選択を再作成することに頼りましたが、これはやり過ぎのようです。古いデータをデータベースからの新しいデータで更新するように EF5 を取得する簡単な方法はありますか?

アップデート

OK - テスト方法の問題であることがわかりました。@jureの返信を見てそれを実装し、それ機能しないように見せた後、私はついに賢くなりました。私は SQL プロファイラーを壊しました。舞台裏で正しいことが起こっていましたが、ビューを更新する正しいことをしていませんでした。それをしたら、元のコードが機能しました。

4

2 に答える 2