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