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

Joh*_*ohn 9 c# entity-framework entity-framework-6

我们目前正在使用延迟加载实体框架并运行out of memory exception.我们遇到此异常的原因是因为Linq查询加载了大量数据,而在后期阶段它使用延迟加载来加载导航属性.但是因为我们没有使用NoTrackingChangesEntity Framework缓存,所以很快就会产生内存错误.

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

然后我测试使用NoChangeTracking:

var account = _dbcontext.Account
                        .AsNoTracking()
                        .SingleOrDefault(m => m.id == 1); 
var contactName = account.Contact.Name
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

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

Eri*_*ips 10

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

var account = _dbcontext.Account.AsNoTracking().SingleOrDefault(m=>m.id == 1);
Run Code Online (Sandbox Code Playgroud)

因此,尝试从它们访问导航属性将永远不会工作:

var contactName = account.Contact.Name
Run Code Online (Sandbox Code Playgroud)

您可以使用显式包含所需的导航属性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
Run Code Online (Sandbox Code Playgroud)

  • 当您需要加载递归实体而不进行跟踪时,这确实使catch 22成为可能。 (2认同)
  • 这里也看到同样的情况。使用 AsNoTracking 进行延迟加载...您可以抛硬币决定它是否有效。有时会,有时不会。 (2认同)