Entity Framework的ObjectContext(v4.0)的奇怪行为

时间:2011-01-05 19:04:40

标签: .net entity-framework

我是从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行为?

谢谢!

2 个答案:

答案 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一级缓存的功能。

EF 4.1 Local Data

HTH

Riana