2017-02-02 39 views
7

其实我有一个Linq查询来获取一个实体及其一些导航属性。AsNoTracking()和包括

context.MyEntity 
    .AsNoTracking() 
    .Include(i=> i.Nav1) 
    .Include(i=> i.Nav2) 
    .Where(x=> x.Prop1==1) 
    .FirstOrDefault(); 

现在我的问题是:

足够此查询不跟踪myEntity所和NAV1,NAV2或必须为每个导航属性添加AsNoTracking。像这样:

context.MyEntity 
    .AsNoTracking() 
    .Include(i=> i.Nav1) 
    .AsNoTracking() 
    .Include(i=> i.Nav2) 
    .AsNoTracking() 
    .Where(x=> x.Prop1==1) 
    .FirstOrDefault(); 
+1

每个查询只需要一次'AsNoTracking',因此您的第一个示例是正确的。我相信第二个会抛出一个运行时异常(不知道哪一个)。 – Igor

+0

如果您链接多个LINQ方法,则始终将返回的序列从先前的方法传递到以下方法。因此,在'AsNoTracking'之后,你有一个查询返回的实体不会被缓存 –

+0

Tks for your help –

回答

4

在完成所有查询参数之前但在将数据移入内存之前,请使用AsNoTracking。在本例中,您需要:

context.MyEntity 
    .Include(i=> i.Nav1) 
    .Include(i=> i.Nav2) 
    .Where(x=> x.Prop1==1) 
    .AsNoTracking() 
    .FirstOrDefault(); 

父实体的任何子对象都不会被跟踪。