EF ChangeTracker 访问被跟踪实体及其导航集合

Posted

技术标签:

【中文标题】EF ChangeTracker 访问被跟踪实体及其导航集合【英文标题】:EF ChangeTracker Accessing Tracked Entity and its navigation collection 【发布时间】:2021-08-05 00:03:14 【问题描述】:

我想跟踪更改。我有一个班级/模型

public class Emp
 
    public MoreInfo MoreInfo  get; set;   
    public ICollection<Works> Works  get; set; 

    public string FirstName  get; set; 
    public string LastName  get; set; 



foreach (var e in _db.ChangeTracker.Entries<TEntity>())

   foreach (var key in e.Properties)
     
         if (key.IsModified)
         
          //I can get the FirstName, LastName fields
         
   

但我不知道如何循环 MoreInfo 和 ICollection Works 并检查其参数?

【问题讨论】:

【参考方案1】:

根据 EF Core 术语,这些不是属性,而是 导航,因此无法通过 Properties 访问它们。使用Navigations 属性获取引用和集合导航属性的条目(具有通用属性/方法)

foreach (var navEntry in e.Navigations)

    // e.MoreInfo, e.Works
    if (navEntry.IsModified)
    
    

ReferenceCollections 获取各自的条目(具有特定的属性/方法)

foreach (var refEntry in e.References)

    // e.MoreInfo
    if (refEntry.IsModified)
    
    

foreach (var colEntry in e.Collections)

    // e.Works
    if (colEntry.IsModified)
    
    

但是propertiesnavigations都被认为是members,所以你可以使用Members来处理它们都使用公共属性/方法

foreach (var memberEntry in e.Members)

    // e.MoreInfo, e.Works, e.FirstName, e.LastName
    if (memberEntry.IsModified)
    
    

【讨论】:

感谢您的回复,我已经厌倦了在检查 IsModified 时使用 foreach(... e.References) > 它设置为始终为 false。我的模型 MoreInfo 有一个字段地址,我在调试 refEntry> CurrentValue> Address 中看到包含新值。我在哪里可以看到原始值 Address ?使用 e.Properties 我看到 key.OriginalValue 和 key.CurrentValue,是否有类似的东西可以看到原始值和当前值? IsModified对于不同的成员类型有不同的含义,在相应的类文档中有说明。对于参考,您应该查看ReferenceEntry 类。例如,TargetEntry 让您可以访问相关的实体数据。 从那里您可以访问其属性、引用、集合,类似于您使用“main”条目的方式。但所有这些都是另一回事(和问题)。 可以访问属性,正如您提到的那样,这是一个不同的故事,但是 IsModified 呢,它总是显示错误,任何想法如何在参考条目中修改字段时获得正确的结果和在收藏?你能帮忙举出我可以测试的例子吗,你的例子总是显示错误?谢谢

以上是关于EF ChangeTracker 访问被跟踪实体及其导航集合的主要内容,如果未能解决你的问题,请参考以下文章

EF Core性能优化

当实体集 ChangeTracker 发生更改时如何通知 UI

EF 学习系列三 数据操作数据加载及EF中执行Sql

EF Core 中DbContext不会跟踪聚合方法和Join方法返回的结果

使用实体框架恢复数据库中的更改

Entity Framework Core中更改跟踪工作原理