4

@RowanMiller は、DbContext に関する彼の本で、DbSet.Local プロパティを使用して、1.) データベースへの不要なラウンドトリップと 2.) アプリケーションでのコレクション (ToList() などで作成) の受け渡しを回避する方法を示しています (24 ページ)。次に、このアプローチに従おうとしました。ただし、 [} – ブロックを使用するブロックから別のブロックに変更すると、DbSet.Local プロパティが空になることに気付きました。

ObservableCollection<Destination> destinationsList;

using (var context = new BAContext())
{ 
   var query = from d in context.Destinations …;
   query.Load();
   destinationsList = context.Destinations.Local; //Nonzero here.
}
//Do stuff with destinationsList

using (var context = new BAContext())
{ 
   //context.Destinations.Local zero here again;
   //So no way of getting the in-memory data from the previous using- block here?
   //Do I have to do another roundtrip to the database here to get the same data I wanted
   //to cache locally???
}

では、24ページのポイントは何ですか?DbSet.Local が using- ブロック内でしか使用できない場合、コレクションの受け渡しを回避するにはどうすればよいですか? さらに、内部でキャッシュ データを相互に引き渡さずにこれらの短命のコンテキスト インスタンスを使用する場合、どのように変更追跡の恩恵を受けることができますか? では、接続などのリソースを解放するためにコンテキストが短命である必要がある場合、このためにキャッシュを放棄する必要がありますか? つまり、両方を同時に使用することはできません (接続は短命ですが、キャッシュは長寿命です)。したがって、私の唯一のオプションは、クエリによって返された結果を自分の変数に格納することです.24ページの動機で何が推奨されていないのでしょうか?

私は、WCF を使用して、将来的に多層化される可能性がある WPF アプリケーションを開発しています。Julia の著書にこの例があることは知っていますが、現在はアクセスできません。http://msdn.microsoft.com/en-us/magazine/cc700340.aspx (古い ObjectContext ですが、レイヤー間のコラボレーションの説明には適しています)など、Web 上で他にもいくつか見つけました。そこでは、長寿命のコンテキストが使用されます (ただし、欠点については言及されていますが、これらに対する解決策は提供されていません)。単一の Destinations.Local が失われるだけではありません。クエリによってフェッチされる他のすべてのエンティティも失われることは確かです。

[編集]: Julia Lerman の本をさらに読んだ後、EF にはデフォルトで第 2 レベルのキャッシュがないことに要約されるようです。いくらかの (かなりの、私が思うに) 努力をすれば、本書や MSDN、codeproject などのさまざまな記事で説明されているように、サードパーティのキャッシュ ソリューションを追加することができます。

この問題が DbContext ブックの DbSet.Local に関するセクションで言及されていれば、それは実際には using {} ブロックが終了したときに破棄される第 1 レベルのキャッシュであることがわかっていれば幸いです (これをより透過的にするための私の提案です)。読者)。最初に読んだ後、新しい DbContext インスタンスにもかかわらず、2 番目の using {} ブロックでも、DbSet.Local は常に同じ参照 (Singleton スタイル) を返すという印象を受けました。

しかし、第 2 レベル キャッシュが私の WPF アプリケーションに適しているかどうかはまだわかりません (Julia が分散アプリケーションに関する記事で第 2 レベル キャッシュについて言及しているように)。または、using {} ブロック内の 1 つまたはいくつかのクエリによって、ドメイン モデルの集計ルート インスタンス (DDD、Eric Evans) をメモリに取得し、DbContext を破棄して、集計インスタンスへの参照のみを保持する方法です。長期的なコンテキストを回避する方法は? この決断を手伝っていただければ幸いです。

http://msdn.microsoft.com/en-us/magazine/hh394143.aspx http://www.codeproject.com/Articles/435142/Entity-Framework-Second-Level-Caching-with-DbConte http:// blog.3d-logic.com/2012/03/31/using-tracing-and-caching-provider-wrappers-with-codefirst/

4

1 に答える 1