私は、Entity Framework v4.0のNHibernateのバックグラウンドから来ています。エンティティをObjectContextにロードすると、ObjectContextが存続している間はエンティティがキャッシュされることが期待されます( '1st level cache')。したがって、同じクエリが2回目に実行された場合、オブジェクトは既にObjectContextにあり、再度ロードする必要はありません。Entity FrameworkのObjectContext(v4.0)の奇妙な動作
は、このクエリを見ている:SQL Serverプロファイラで
using (var context = new Model1Container()) {
//load entities from DB
var entities = context.Entity1Set.ToArray();
//entities should now be cached in the context (1st level cache)
//why does this call not use the cached items?
entities = context.Entity1Set.ToArray();
}
を、私は両方のToArray()の呼び出しは、データベースクエリをトリガすることをはっきりと見ることができます。なぜ、2番目のクエリは、NHibernateの動作ではなく、DBのラウンドトリップが必要ですか?
ありがとうございます!
は、コンテキストにすでにある特定のIDとしなければならない操作は、データベースへの別のラウンドトリップを必要としません。私の経験をもとに、合意しました。私にすべてのアイテムを与えるなどの一般的な操作は常にdbに移動します。 – e36M3
これは驚くことではありません。エンティティ配列の.Where()メソッドを実行すると、実際にはLINQ to Objectsではなく、LINQ to Entitiesを使用することになります。 LINQ to Entitiesが一般にクエリの結果をキャッシュすることができるのでしょうか? – cheeesus
別のこと:私たちのObjectContextが長生きすると、データベース内のデータが呼び出し間で変更される可能性がある場合、ObjectContext.Refreshを使用できます。ほとんどの場合、ObjectContextは非常に短命です。したがって、その存続期間中のデータベースの変更については気にしません – cheeesus