2

我对实体框架的理解是,如果它可以从它的缓存中回答查询,它会。我简单的测试结果则显示,重复的查询访问数据库,即使他们之前得到的答复肯定:做Linq实体查询*总是*命中数据库?

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

这些查询都是成功的。对于每一个,我在SQL Profiler中看到一个SELECT TOP (2)

为什么EF转到数据库进行第二次查询?

回答

2

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

编辑:EF没有透明的现成缓存。但它在工作单元内有明确的缓存:ObjectContext.GetObjectByKey

+0

这是美中不足的苍蝇。感谢您的信息,并链接到解决方案! – ladenedge 2010-10-11 15:32:38

+1

这并非完全正确。我认为你会混淆EF和L2E。 LINQ to Entities默认不使用缓存,但EF *在其上下文中缓存物化实例。尝试,例如,'ObjectContext.GetObjectByKey' – 2010-10-11 16:09:00

+0

@Craig Stuntz我的意思是透明的缓存(就像凝固意味着什么)。 – Andrey 2010-10-11 17:15:42

3

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

+0

好文章,谢谢! – ladenedge 2010-10-11 15:34:15