【问题标题】:Clarification on behaviour of QueryTrackingBehavior property of ChangeTracker (EF Core)澄清 ChangeTracker (EF Core) 的 QueryTrackingBehavior 属性的行为
【发布时间】:2022-11-12 09:48:00
【问题描述】:

QueryTrackingBehaviorChangeTracker 属性发生更改时,请帮助澄清 EF Core 的行为。

假设到目前为止,代码中的所有内容都是默认设置(这意味着跟踪所有查询)。一些数据已被读取/更新和跟踪。

现在我们将ChangeTrackerQueryTrackingBehavior 属性更新为NoTracking。这是否“重置”了对先前读取的实体的跟踪?

假设我们读取了额外的数据(现在没有跟踪)。

如果我们将ChangeTrackerQueryTrackingBehavior 属性更改回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 时,实体仍然可以附加到更改跟踪器,因此名称为“询问跟踪行为”。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 2022-09-23
      • 2021-12-26
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多