使用AsNoTracking()entity framework延迟加载

我们目前正在使用延迟加载entity framework并运行out of memory exception 。 我们遇到此exception的原因是因为Linq查询加载了大量数据,而在后期阶段它使用延迟加载来加载导航属性。 但是因为我们不使用NoTrackingChangesentity framework缓存非常快速地构建,这导致内存不足错误。

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

然后我使用NoChangeTracking测试:

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

但是我收到以下错误:

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

您已指定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