caching - 帮助我了解 Entity Framework 4 延迟加载的缓存

标签 caching entity-framework-4

我在 Entity Framework 4.0 中遇到了一些意外的行为,我希望有人可以帮助我理解这一点。为了解决这个问题,我使用了 Northwind 数据库。我还使用默认的代码生成器(不是 poco 或 self 跟踪)。我希望每当我查询框架的上下文时,如果我尚未获取这些对象,则仅进行往返。如果我关闭延迟加载,我确实会出现这种行为。目前,在我的应用程序中,我正在短暂地打开延迟加载,然后将其关闭,以便我可以获得所需的行为。这太糟糕了,所以请帮忙。这是一个很好的代码示例,可以演示我的问题。

Public Sub ManyRoundTrips()
    context.ContextOptions.LazyLoadingEnabled = True
    Dim employees As List(Of Employee) = context.Employees.Execute(System.Data.Objects.MergeOption.AppendOnly).ToList()

    'makes unnessesary round trip to the database, I just loaded the employees'
    MessageBox.Show(context.Employees.Where(Function(x) x.EmployeeID < 10).ToList().Count)
    context.Orders.Execute(System.Data.Objects.MergeOption.AppendOnly)
    For Each emp As Employee In employees
        'makes unnessesary trip to database every time despite orders being pre loaded.'
        Dim i As Integer = emp.Orders.Count
    Next
End Sub

Public Sub OneRoundTrip()
    context.ContextOptions.LazyLoadingEnabled = True
    Dim employees As List(Of Employee) = context.Employees.Include("Orders").Execute(System.Data.Objects.MergeOption.AppendOnly).ToList()

    MessageBox.Show(employees.Where(Function(x) x.EmployeeID < 10).ToList().Count)

    For Each emp As Employee In employees
        Dim i As Integer = emp.Orders.Count
    Next
End Sub

为什么第一 block 代码会进行不必要的往返?

最佳答案

您的期望不正确。查询总是查询数据库。总是。这是因为 LINQ 总是转换为 SQL。

要从上下文中加载对象(如果已获取)和从数据库加载对象(如果尚未获取),请使用 ObjectContext.GetObjectByKey() .

关于caching - 帮助我了解 Entity Framework 4 延迟加载的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2725149/

相关文章:

asp.net-mvc-2 - ASP.net MVC 2 应用程序教程,使用带有许多表的 Entity Framework

javascript - 如何在安装命令时在 npm5 中指定缓存文件夹?

java - java中的缓存

security - HTML5 sessionStorage 可以写入磁盘吗?

C++ 原子变量可见性

asp.net-mvc - EntityFramework.SqlServer.dll 中发生类型 'System.Data.Entity.Core.EntityException' 的异常,但未在用户代码中处理

asp.net-mvc-3 - 无法将 lambda 表达式转换为类型 'string',因为它不是委托(delegate)类型

iphone - AFNetworking 检查图像是否被缓存

oracle - 使用 EF4 将 Int32 转换为 Oracle number(5)

entity-framework - DbContext - 三个表之间的多对多关系