使用AsNoTracking()实体框架延迟加载

时间:2017-11-08 20:03:13

标签: c# entity-framework entity-framework-6

我们目前正在使用延迟加载实体框架并运行到out of memory exception。我们遇到此异常的原因是因为Linq查询加载了大量数据,而在后期阶段它使用延迟加载来加载导航属性。但是因为我们不能快速使用NoTrackingChanges实体框架缓存,所以会导致内存不足错误。

我对EF的理解是我们应该始终在查询中使用NoTrackingChanges,除非您想从查询中更新返回的对象。

然后我使用NoChangeTracking进行了测试:

var account = _dbcontext.Account
                        .AsNoTracking()
                        .SingleOrDefault(m => m.id == 1); 
var contactName = account.Contact.Name

但是我收到以下错误:

  

System.InvalidOperationException:当使用NoTracking合并选项返回对象时,只能在EntityCollection或EntityReference不包含对象时调用Load。

1 个答案:

答案 0 :(得分:8)

您已指定EF不跟踪您实例化的Account值:

var account = _dbcontext.Account.AsNoTracking().SingleOrDefault(m=>m.id == 1);

因此尝试访问它们的导航属性将永远不会起作用:

var contactName = account.Contact.Name

您可以使用Include()明确包含所需的导航属性。所以以下内容应该有效:

var account = _dbcontext.Account
  .Include(a => a.Contact)
  .AsNoTracking()
  .SingleOrDefault(m=>m.id == 1);

var contactName = account.Contact.Name;  // no exception, it's already loaded