【问题标题】:How to get list of changed properties in EF Core?如何获取 EF Core 中更改的属性列表?
【发布时间】:2021-10-07 15:58:02
【问题描述】:

我可以轻松获取 EntityEntry 及其状态:

EntityEntry<Customer> entry = dbContext.Entry(customer);

如何获取 EntityEntry 的更改属性列表?

我有这样的事情:

entry.CurrentValues.Properties
    .Where(prop => changedEntry.CurrentValues[prop] != changedEntry.OriginalValues[prop])
    .Select(prop => new 
    {
        Property = prop, 
        Value = changedEntry.CurrentValues[prop] 
    });

但它不支持 ValueComparers。

【问题讨论】:

  • 有一个类似的老问题,但我不能接受接受的答案,因为它不支持映射到字段、值转换器等的列
  • 什么是不可接受的,为什么?在问题本身中提及这一点。此外,ValueComparers 不会更改属性。它们是用来加载属性的东西,无论它们是否被改变。您不会在更改跟踪器中找到它们,而是在 DbSet 的元数据中找到它们

标签: c# entity-framework-core .net-5 change-tracking


【解决方案1】:

您可以通过以下方式做到这一点:

entry.Properties
    .Where(prop => prop.IsModified)
    .Select(prop => new
    {
        Property = prop.Metadata,
        Value = prop.CurrentValue,
    });

其他方法需要访问 EF Core 的 Internal 命名空间。

【讨论】:

  • 您确定DetectChanges() 是必需的吗?我看到DbContext.ChangeTracker.Entries() 试图调用 DetectChanges()。不过,不确定DbContext.Entry()
  • 您可以拨打一次ChangeTracker.DetectChanges() - 就是这样。我会更新答案。
  • 我知道,我只是不确定是否需要显式调用ChangeTracker.DetectChanges()entry.DetectChanges()。例如这里它被自动调用:dotnetfiddle.net/ysaIor
  • 附加是不同的东西,在这种情况下,您已经指示 ChangeTracker 更改了哪些内容。
  • IOW,请始终致电DetectChanges
猜你喜欢
  • 2021-11-18
  • 2012-03-16
  • 2021-11-23
  • 2021-10-20
  • 2021-02-05
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
相关资源
最近更新 更多