Entity Framework 5 でデータを更新する最良の方法は何ですか? データが常に変化しているデータベースからの統計を表示する WPF アプリケーションがあります。アプリケーションは10秒ごとに結果を更新していますが、EFのデフォルトの動作は以前の結果をキャッシュするようです。したがって、新しいデータセットをロードできるように、以前の結果を無効にする方法が必要です。
関心のあるコンテキストは、次のように定義されます。
public partial class MyEntities: DbContext
{
...
public DbSet<Stat> Stats { get; set; }
...
}
いくつか読んだ後、いくつかのアプローチを見つけることができましたが、これらの方法がどれほど効率的で、欠点があるかどうかはわかりません.
エンティティ オブジェクトの新しいインスタンスを作成する
using (var db = new MyEntities()) { var stats = from s in db.Stats ... }
これは機能しますが、データを取得する場所が他にもたくさんあり、データが必要になるたびに新しい接続を再開したくないため、非効率的です。接続を開いたままにして、別の方法で行う方が効率的ではないでしょうか?
に電話
refresh
するObjectContext
var stats = from s in db.Stats ... ObjectContext.Refresh(RefreshMode.StoreWins, stats );
これは、次の方法で dbContext から ObjectContext を抽出していることも前提としています。
private MyEntities db = null; private ObjectContext ObjectContext { get { return ((IObjectContextAdapter)db).ObjectContext; } }
これは、私が現在使用しているソリューションです。シンプルに思えます。しかし、EF チームは誰もそれを必要としないと考えており、必要なことはすべて DbContext で直接行うことができるため、最近の ObjectContext は DbContext で直接アクセスできないことをどこかで読みました。これは、おそらくこれが最善の方法ではないのではないかと思います。
reload
方法があることは知っていdbContext.Entry
ますが、単一のエンティティをリロードするのではなく、エンティティのリストを取得するため、この方法が機能するかどうかはわかりません。最初のクエリで 5 つの統計オブジェクトを取得し、それらをリストに保存し、reload
更新時にそれらを実行すると、データベースのリストに追加された他のオブジェクトを見逃す可能性があります。または、方法を完全に誤解していreload
ますか?DbSet
指定した でリロードできますMyEntities
か?
上記のいくつかの質問がありますが、私が主に知りたいのは、データベースに同じクエリを何度も要求するための EF5 のベスト プラクティスは何ですか? それは私がまだ発見していないものかもしれません...