Entity Framework 6 : 延迟加载不起作用
Entity Framework 6 : lazy loading doesn't work
属性定义为virtual
。但是在我访问订单属性之前,订单实体的数据已经被加载,为什么?
完整源代码:
几件事:
当您声明:不起作用时,您收到了订单,但当您期望不同的值时 $ 数字为 0.0?您似乎有 2 条订单记录,但根据返回的结果,您期望得到一个非零数字,这两个记录都不是零吗?在调试视图中,展开弹出上下文菜单中的 "Orders",这将显示 EF 已加载的订单详细信息。
首先,您应该小心使用 "OrDefault" 方法的再现。您的代码假设返回了一个值。在这些情况下,您最好根据情况使用 Single()
或 First()
。
此外,在使用 First
时,您应该指定一个 OrderBy
子句以确保有可靠的排序。
SaveChanges
只应在修改数据时调用。
最后,延迟加载是按需加载不常用数据的推动者。您应该在很大程度上避免依赖延迟加载调用。如果您需要整个实体并且您知道您将要使用订单,那么请预先加载它们。
即
using (var context = new EfContext())
{
var customer = context.Customers
.Include(c => c.Orders)
.Single(c => c.CustomerId = customerId);
// Do stuff...
}
如果您只需要给定员工的 1 个适用订单,请考虑使用 Select
检索它:
即
using (var context = new EfContext())
{
var data = context.Customers.Where(c => c.CustomerId = customerId)
.Select(c => new { Customer = c, FirstOrder = c.Orders.OrderBy(o => o.OrderDate).FirstOrDefault()})
.Single();
// Do Stuff...
}
这将为您提供一个匿名类型,其中包含客户(无需预先加载订单)和匹配的第一个订单。
更好的方法是使用 Select
从客户和订单中检索您需要的特定字段。这减少了从数据库中提取的数据量(行和列)。
sorry,好像是visual studio的问题,注释调用语句时,命令table的sql查询不再执行,但是调用时语句被包含,虽然设置了断点,命令table的sql查询仍然被执行。
visual studio调试自动执行表达式
comment the staement
sql profiler
include the statement
sql profiler
属性定义为virtual
。但是在我访问订单属性之前,订单实体的数据已经被加载,为什么?
完整源代码:
几件事:
当您声明:不起作用时,您收到了订单,但当您期望不同的值时 $ 数字为 0.0?您似乎有 2 条订单记录,但根据返回的结果,您期望得到一个非零数字,这两个记录都不是零吗?在调试视图中,展开弹出上下文菜单中的 "Orders",这将显示 EF 已加载的订单详细信息。
首先,您应该小心使用 "OrDefault" 方法的再现。您的代码假设返回了一个值。在这些情况下,您最好根据情况使用 Single()
或 First()
。
此外,在使用 First
时,您应该指定一个 OrderBy
子句以确保有可靠的排序。
SaveChanges
只应在修改数据时调用。
最后,延迟加载是按需加载不常用数据的推动者。您应该在很大程度上避免依赖延迟加载调用。如果您需要整个实体并且您知道您将要使用订单,那么请预先加载它们。
即
using (var context = new EfContext())
{
var customer = context.Customers
.Include(c => c.Orders)
.Single(c => c.CustomerId = customerId);
// Do stuff...
}
如果您只需要给定员工的 1 个适用订单,请考虑使用 Select
检索它:
即
using (var context = new EfContext())
{
var data = context.Customers.Where(c => c.CustomerId = customerId)
.Select(c => new { Customer = c, FirstOrder = c.Orders.OrderBy(o => o.OrderDate).FirstOrDefault()})
.Single();
// Do Stuff...
}
这将为您提供一个匿名类型,其中包含客户(无需预先加载订单)和匹配的第一个订单。
更好的方法是使用 Select
从客户和订单中检索您需要的特定字段。这减少了从数据库中提取的数据量(行和列)。
sorry,好像是visual studio的问题,注释调用语句时,命令table的sql查询不再执行,但是调用时语句被包含,虽然设置了断点,命令table的sql查询仍然被执行。
visual studio调试自动执行表达式
comment the staement
sql profiler
include the statement
sql profiler