【问题标题】:Entity Framework 4 goes back to the database when executing the same query twiceEntity Framework 4 在两次执行相同的查询时返回数据库
【发布时间】:2011-07-05 14:07:17
【问题描述】:

我一直认为 EF 会缓存查询结果,并且它只会从其内部缓存中返回一个实体列表,而不是在数据库上执行两次相同的查询。

var cipEntities = new CIPEntities(); // instantiate objectcontext
Console.WriteLine(cipEntities.Customers.ToList()); // fires db query
Console.WriteLine(cipEntities.Customers.ToList()); // also fires db query

我有错误的假设吗?会不会是我对 RIA 服务的体验感到困惑,也许 RIA 服务会缓存结果而 EF 不会?

谢谢

【问题讨论】:

    标签: .net asp.net entity-framework


    【解决方案1】:

    您可以将生成的对象列表存储在静态列表中,然后随意查询,而无需返回数据库。

    如果您想调整缓存,可以查看:Tracing and Caching Providers

    如果你要通过 id 查询,你可以使用 ObjectContext.GetObjectByKey 方法,它会在查询 db 之前先在对象缓存中查找。

    【讨论】:

      【解决方案2】:

      是的,你的假设是错误的。 EF 没有二级缓存(缓存查询),因此当您执行查询时,EF 不知道它是已在同一上下文中执行的查询,它会再次执行查询。 EF 中的主要规则 - 即使结果已经被上下文跟踪(并且可以从上下文中提取),也始终执行查询。

      解决方案是@Robotsushi 提到的缓存提供程序。

      【讨论】:

        【解决方案3】:

        这是 EF 的标准行为,解决此问题的一种简单方法是将结果缓存到局部变量并改用它:

        var results = cipEntities.Customers.ToList();
        Console.WriteLine(results);
        Console.WriteLine(results);
        

        【讨论】:

        • @Chad:这就是他将结果保存在本地列表中的原因。
        • @Chad - 我认为你错过了这里的重点。您将其缓存到本地列表(请参阅查询中对ToList() 的调用),因此无需再次调用ToList()
        【解决方案4】:

        除非您选择将其转换为预枚举类(即.ToList()),否则 EF 将在您每次尝试枚举时执行查询。事实上,如果您将复杂类用作存储过程结果,除非您使用枚举集合对其进行强制转换,否则它将引发错误。

        【讨论】:

          猜你喜欢
          • 2018-08-31
          • 2013-05-23
          • 1970-01-01
          • 2012-02-03
          • 2022-01-22
          • 1970-01-01
          • 2011-03-13
          • 1970-01-01
          • 2016-07-10
          相关资源
          最近更新 更多