9

EF で読み込んだデータのリストを含むグリッドを持つ WPF アプリがあります。他のウィンドウは、グリッドにロードされた同じデータを変更できますが、別の dbcontext インスタンスを使用します。変更されたデータをグリッドで確認するにはどうすればよいですか? 単一のエンティティを更新できることはわかっていますctx.Entry<MyEntity>(instance).Reload();が、すべての変更を確認したいのですが、何をしても古い値しか表示されません。AsNoTrackingこの場合、新しいDbContextインスタンスの作成も使用できません。

4

1 に答える 1

14

私には非常に単純なケースのように見え、EF がエンティティの値を更新しない理由がわかりません。

EF にもこのメカニズムがありますが、DbContext API では公開されていません。ObjectContext に戻る必要があります。エンティティのセットをリロードするだけの場合は、次のように呼び出します。

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload);

RefreshMode.StoreWins保留中のすべての変更が再ロードされた値によって上書きされます。which を使用RefreshMode.ClientWinsして変更を保持し、それらをリロードされたデータとマージすることもできます。このアプローチの問題は、既に持っているエンティティのみをリロードすることです。新しいエンティティは取得されません。

新しいエンティティも取得したい場合は、クエリを実行する必要があり、値をリロードすることを EF に伝える必要があります。

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var objectSet = objectContext.CreateObjectSet<MyEntity>();
objectSet.MergeOption = MergeOption.OverwriteChanges;
var result = objectSet.Where(...).ToList();

保留中のすべての変更を再びMergeOption.OverwriteChanges上書きしますが、MergeOption.PreserveChangesリロードされた値を編集した値にマージするために使用できます。

データベースで削除されたエンティティや、いくつかのリレーションで値を更新すると、まだ問題が発生する可能性があると思います。

于 2012-09-03T13:02:46.007 に答える