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)
或Reference
和Collections
获取各自的条目(具有特定的属性/方法)
foreach (var refEntry in e.References)
// e.MoreInfo
if (refEntry.IsModified)
foreach (var colEntry in e.Collections)
// e.Works
if (colEntry.IsModified)
但是properties和navigations都被认为是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 访问被跟踪实体及其导航集合的主要内容,如果未能解决你的问题,请参考以下文章
当实体集 ChangeTracker 发生更改时如何通知 UI