【问题标题】:Do Linq to Entities queries *always* hit the database?Linq to Entities 查询*总是*命中数据库吗?
【发布时间】:2010-10-11 15:00:11
【问题描述】:

我对实体框架的理解是,如果它可以从缓存中回答查询,它就会回答。然而,我的简单测试显示重复的查询会命中数据库,即使它们之前得到了肯定的回答:

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

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

为什么 EF 会去数据库进行第二个查询?

【问题讨论】:

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


    【解决方案1】:

    EF 总是执行查询但返回对象的相同实例。第二个查询没有具体化到新对象中,而是返回第一个查询创建的实例。这是关于该行为的article。还有一些额外的概念可以强制进行第二次查询,例如更新现有实例。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 那真是美中不足。感谢您提供信息以及解决方案的链接!
      • 这并不完全正确。我认为您混淆了 EF 和 L2E。 LINQ to Entities 默认情况下不使用缓存,但 EF 确实 在其上下文中缓存物化实例。试试,例如,ObjectContext.GetObjectByKey
      • @Craig Stuntz 我的意思是透明缓存(就像 ladenedge 的意思一样)。
      • 我确实是说透明缓存,但我想知道:有没有办法查询 EF 缓存?无论哪种方式,使用 Andrey 链接中的缓存提供程序是否更合适?
      • @Andrey,我明白你的意思,但我是在回应你写的内容。 EF 和 L2E 不是一回事! @ladenedge,如果您需要一个持续时间超过一个工作单元的缓存,那么是的,您需要一个缓存提供程序。如果您希望缓存对象 within 一个工作单元,就像您在问题中的示例一样,请使用GetObjectByKey
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多