Linq to Entities查询*总是*命中数据库吗?

时间:2010-10-11 15:00:12

标签: .net entity-framework linq-to-entities entity-framework-4

我对实体框架的理解是,如果它可以从其缓存中回答查询,那么它将会。然而,我的简单测试表明,重复的查询会在数据库中出现问题,即使它们之前得到了肯定的回答:

var u1 = context.Users.SingleOrDefault(u => u.Id == 1);
var u2 = context.Users.SingleOrDefault(u => u.Id == 1);

这些查询成功。对于每个,我在SQL事件探查器中看到SELECT TOP (2)

为什么EF会转到第二个查询的数据库?

2 个答案:

答案 0 :(得分:3)

EF始终执行查询但返回对象的同一实例。第二个查询未实现为新对象,而是返回由第一个查询创建的实例。这是关于该行为的article。有一些附加概念可以强制第二个查询例如更新现有实例。

答案 1 :(得分:2)

好吧,因为EF不使用缓存。 nHibernate的确如此。 Here有关如何使用EF启用缓存的文章。

编辑:EF没有透明的开箱即用缓存。但它在工作单元中有明确的缓存:ObjectContext.GetObjectByKey