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
相关产品推荐
相关产品推荐

