【问题标题】:Clarification on behaviour of QueryTrackingBehavior property of ChangeTracker (EF Core)澄清 ChangeTracker (EF Core) 的 QueryTrackingBehavior 属性的行为
【发布时间】:2022-11-12 09:48:00
【问题描述】:
当 QueryTrackingBehavior 的 ChangeTracker 属性发生更改时,请帮助澄清 EF Core 的行为。
假设到目前为止,代码中的所有内容都是默认设置(这意味着跟踪所有查询)。一些数据已被读取/更新和跟踪。
现在我们将ChangeTracker 的QueryTrackingBehavior 属性更新为NoTracking。这是否“重置”了对先前读取的实体的跟踪?
假设我们读取了额外的数据(现在没有跟踪)。
如果我们将ChangeTracker 的QueryTrackingBehavior 属性更改回TrackAll,那么在更改之前读取的实体是否保留其跟踪,以便SaveChanges() 执行正确的更新,忽略在设置ChangeTracker 时读取的任何内容到NoTracking?
【问题讨论】:
标签:
entity-framework-core
change-tracking
【解决方案1】:
设置QueryTrackingBehavior 仅影响随后运行的查询,修改此属性不会影响被跟踪实体的状态。
这可以通过列出更改跟踪器中的实体来检查,例如:
context.Products.Find(1);
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
context.Products.Find(2);
context.Products.Add(new Product { Id = 21 });
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll;
context.Products.Find(3);
var ids = context.ChangeTracker.Entries()
.Select(e => ((Product)e.Entity).Id).ToList();
结果是:
21
1
3
如您所见,Product 2 没有被跟踪,而当QueryTrackingBehavior 设置为NoTracking 时,实体仍然可以附加到更改跟踪器,因此名称为“询问跟踪行为”。