【问题标题】:Use EF changetracker to manually get set of changes?使用 EF changetracker 手动获取更改集?
【发布时间】:2025-11-27 00:55:01
【问题描述】:

如果我加载一个实体,进行一些更改,然后去保存它,EF 会生成一个更新语句。

这一定意味着某些东西(可能是更改跟踪器)正在导航加载的对象层次结构并生成更改的(实体、属性、值)列表。对于一些不相关的基础设施,我需要以类似的方式基本区分对象图。我在想我应该能够重用相同的机制。

所以这就是问题 - 我可以这样做吗?我可以查询对特定实体甚至整个对象图的更改吗?怎么样?

【问题讨论】:

标签: c# entity-framework change-tracking


【解决方案1】:

您可以使用上下文的DbChangeTracker,它返回IEnumerable<DbEntityEntry>。然后,您可以遍历这些比较 CurrentValues 和 OriginalValues。原始值是从最后一次查询到数据库的值。

var modifiedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Modified);
foreach (DbEntityEntry entity in modifiedEntries)
{
    foreach (var propName in entity.CurrentValues.PropertyNames)
    {
        var current = entity.CurrentValues[propName];
        var original = entity.OriginalValues[propName];
    }
}

【讨论】:

  • 这看起来不错......一旦我......弄清楚我怎么能在单元测试中尝试这个,我会接受。