2012-09-03 8 views
9

私は、EFでロードしたデータのリストを持つグリッドを持つWPFアプリケーションを持っています。他のウィンドウでは、グリッド上にロードされた同じデータを変更することはできますが、別のdbcontextインスタンスを使用することができます。グリッド上で変更されたデータを表示するにはどうすればよいですか?私はctx.Entry<MyEntity>(instance).Reload();と単一のエンティティをリフレッシュすることができます知っている - しかし、私はすべての変更を参照したいと私は何をしても、私は古い値を参照してください。この場合、インスタンスを新規作成しないでください。AsNoTrackingを使用することはできません。別のDbContextで変更をロードする

+0

なぜあなたは 'AsNoTracking'を使用できませんか? –

+0

グリッドに直接変更を加えて保存することができるためです。 – user1526627

+0

そのような場合、保存されていないデータを編集してリロードすると、これらのデータが異なる場合があります。あなたはどのようにそのような問題を解決したいですか? –

答えて

13

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

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

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

RefreshMode.StoreWinsすべての保留中の変更は、リロード値によって上書きされます。 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を使用することができます編集した値に値を再ロードしました。

私はまだいくつかの関係といくつかの関係で、そしておそらくデータベースで削除されたエンティティの値をリフレッシュすることにいくつかの問題があると思います。

+0

これはまさに私が必要としているものです、ありがとう、EFに関する私の信念が復元されています:) – user1526627

+0

@ ladislav-mrnka 1つの質問、最後のステップは本当に必要ですか?私があなたを正しく理解していれば、EFはすでに読み込んだレコードの変更を認識し、最初の方法でマージします。したがって、テーブルに新しい行を手動で追加する場合は、最初の方法でdbcontextに更新されることはありませんか?私はちょうどこれを試み、私は第二の方法の必要性を見た。多分、行動が変わったか、私はあなたを完全に誤解しましたか? :) – DrCopyPaste

関連する問題