EF で読み込んだデータのリストを含むグリッドを持つ WPF アプリがあります。他のウィンドウは、グリッドにロードされた同じデータを変更できますが、別の dbcontext インスタンスを使用します。変更されたデータをグリッドで確認するにはどうすればよいですか? 単一のエンティティを更新できることはわかっていますctx.Entry<MyEntity>(instance).Reload();
が、すべての変更を確認したいのですが、何をしても古い値しか表示されません。AsNoTracking
この場合、新しいDbContext
インスタンスの作成も使用できません。
1 に答える
私には非常に単純なケースのように見え、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
リロードされた値を編集した値にマージするために使用できます。
データベースで削除されたエンティティや、いくつかのリレーションで値を更新すると、まだ問題が発生する可能性があると思います。