You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core中如何获取EntityEntry对应的已变更属性列表

EF Core 从EntityEntry获取支持ValueComparer的变更属性列表

问题根因

原有实现直接使用!=运算符对原始值和当前值做引用/值比较,没有调用EF Core为属性配置的ValueComparer,因此无法识别自定义比较规则的属性变更(比如JSON映射属性、集合类型属性、自定义转换类型属性等场景都会判断错误)。

正确实现方案

方案1:直接使用EF Core内置变更检测结果(最推荐)

EF Core内部判断属性IsModified状态时,已经自动调用了该属性绑定的ValueComparer,无需自行实现比较逻辑:

var changedProperties = entry.Properties
    .Where(p => p.IsModified)
    .Select(p => new 
    {
        Property = p.Metadata,
        OriginalValue = p.OriginalValue,
        CurrentValue = p.CurrentValue
    })
    .ToList();

方案2:手动调用ValueComparer比较(适用于自定义检测场景)

如果你需要绕过EF Core内置的变更跟踪状态、自行执行比较逻辑,可以主动获取属性对应的ValueComparer执行比较:

var changedProperties = entry.Metadata.GetProperties()
    .Where(prop => 
    {
        var comparer = prop.GetValueComparer();
        var originalValue = entry.GetOriginalValue(prop);
        var currentValue = entry.GetCurrentValue(prop);
        return !comparer.Equals(originalValue, currentValue);
    })
    .Select(prop => new
    {
        Property = prop,
        OriginalValue = entry.GetOriginalValue(prop),
        CurrentValue = entry.GetCurrentValue(prop)
    })
    .ToList();

注意事项

上述方案仅覆盖标量属性的变更检测,如果需要检测Owned实体、导航属性的变更,需要单独遍历entry.References(引用导航)、entry.Collections(集合导航)做对应处理。

内容的提问来源于stack exchange,提问作者Liero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:39:05