实体框架6:延迟加载不起作用

时间:2018-11-12 03:29:14

标签: entity-framework lazy-loading

该属性定义为virtual。但是在我访问订单属性之前,订单实体的数据已加载,为什么?

debug screenshots

完整源代码:

full source code

2 个答案:

答案 0 :(得分:0)

几件事:

当您声明:不起作用时,您将获得订单,但是当您期望其他值时,$数字为0.0?您似乎有2笔订单记录,但是基于返回的结果,您期望的数字不是零,这两个记录都是非零的吗?在调试视图中,展开弹出菜单中的“订单”,这将显示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从客户和订单中检索您需要的特定字段。这样可以减少从数据库中拉回的数据量(行和列)。

答案 1 :(得分:0)

对不起,好像是Visual Studio的问题,当注释调用语句时,不再执行订单表的sql查询,但是当包含调用语句时,尽管设置了断点,订单表的sql查询仍然被执行。

Visual Studio调试自动执行表达式

comment the staement

sql profiler

include the statement

sql profiler