我有一个 Linq 查询,用于获取实体及其一些导航属性。
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();
在完成所有查询参数之后,但在将数据移动到内存之前,使用 AsNoTracking。在此示例中,您需要:
context.MyEntity
.Include(i=> i.Nav1)
.Include(i=> i.Nav2)
.Where(x=> x.Prop1==1)
.AsNoTracking()
.FirstOrDefault();
不会跟踪父实体的任何子对象。
在 .net 核心中,请考虑使用:
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
这将禁用作为配置而不是查询属性的跟踪行为(请注意,该行为仅适用于该上下文,除非您将其添加到上下文构造函数)。