我在 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/