我是从NHibernate背景到Entity Framework v4.0。当我将实体加载到ObjectContext中时,只要ObjectContext存在('第一级缓存'),我希望它们可以缓存在那里。因此,如果第二次执行相同的查询,则对象已经在ObjectContext中,不应再次加载。
看看这个查询:
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();
}
在SQL Server Profiler中,我可以清楚地看到两个ToArray()调用都会触发数据库查询。为什么第二个查询需要DB往返,而不是NHibernate行为?
谢谢!
答案 0 :(得分:2)
好问题。我从未使用过NHibernate,但过去一年左右我一直在使用Entity Framework。
在某些方面,您描述的行为对我有意义。如果数据库中的数据在不同呼叫之间变化怎么办?例如,Entity Framework必须重新查询数据库以检查是否有任何新行已添加到数据库表中。
但是,对结果执行LINQ查询不需要再次往返数据库,因为Entity Framework将从ObjectContext中获取现有实体。
var newEntities = entities.Where(x=>x.id==1).ToList();
var newEntities2 = entities.Where(x=>x.id==1).ToList();
答案 1 :(得分:1)
EF 4.0不支持任何形式的缓存,不像NHibernate那样支持第一级和第二级缓存。
在EF 4.1中实现了一个类似于NHibernate一级缓存的功能。
HTH
Riana