EF Core 5.0.1中AsNoTrackingWithIdentityResolution仍追踪实体及调用位置疑问
EF Core 5.0.1 无追踪查询相关问题解答
1. AsNoTrackingWithIdentityResolution 出现追踪日志的原因
使用AsNoTrackingWithIdentityResolution时,EF Core会创建一个独立的临时变更追踪器,用来在查询过程中识别重复实体,避免为同一个数据库记录创建多个实体实例。日志里出现的“Order entities are being tracked”提示,就是这个临时追踪器在工作的表现,并非上下文的常规实体追踪。查询完成后,这个临时追踪器会被释放,不会导致实体被上下文持续追踪,属于正常现象。
2. AsNoTracking系列方法的放置规则
- 无需对每个关联表单独调用,一次调用即可作用于整个查询(包括所有Include的关联实体)。
- 必须将方法放在根查询的起始位置,也就是紧跟在
_context.Customers这类DbSet调用之后。如果放在Include、Where之后,甚至ToListAsync之前,会因为查询链的构建逻辑导致无追踪设置不生效。
比如你的原代码写法就是正确的:
return await _context.Customers.AsNoTracking() .Include(x => x.Orders) .Include(x => x.OrderDetails) .Include(x => x.Payments) .Include(x => x.Shipments) .Where(x => x.Id == CustomerDto.Id) .ToListAsync();
如果把AsNoTracking()移到Where之后或者ToListAsync()之前,就会出现实体仍被追踪的问题,因为此时无追踪设置没有覆盖到整个查询链。
内容的提问来源于stack exchange,提问作者Stack Undefined
相关产品推荐
相关产品推荐

