【问题标题】:In Entity Framework, how can I see changes before saving?在实体框架中,如何在保存之前查看更改?
【发布时间】:2022-01-04 19:48:05
【问题描述】:

是否有一种方法可以在实体框架中调用以查看已更改(在内存中)并在调用 SaveChanges 时将写入磁盘的数据?

我想向用户显示一些内容,表明存在未保存的更改。表级别还可以,但我想知道特定字段/列是否有未保存的更改。

【问题讨论】:

  • 请详细描述您对哪些变化感兴趣以及为什么需要了解这些变化。

标签: entity-framework entity-framework-core


【解决方案1】:

例如,将此方法添加到您的上下文中:

IEnumerable<(string Key, string Entity, EntityState state,
    IEnumerable<(string Property, object OriginalValue, object CurrentValue)> Properties)> GetChanges()
{
    var states = new[] { EntityState.Added, EntityState.Modified, EntityState.Deleted };
    return this.ChangeTracker.Entries().Where(c => states.Contains(c.State))
        .Select(entry =>
            (
                string.Join(",", entry.Metadata.FindPrimaryKey()
                    .Properties.Select(p => p.PropertyInfo.GetValue(entry.Entity))),
                entry.Metadata.ClrType.Name,
                entry.State,
                entry.Properties
                    .Where(p => p.IsModified == (p.EntityEntry.State == EntityState.Modified))
                    .Select(prop =>
                    (
                        prop.Metadata.PropertyInfo.Name, 
                        prop.OriginalValue, 
                        prop.CurrentValue
                    )
            )));
}

它返回添加、修改或删除的实体对象,列出它们的类名(不是表名)及其属性,以及原始值和当前值。还包括键值,以便能够区分相同类型的对象。

在已修改的实体中,仅列出已更改的属性。

【讨论】:

  • 如何将其添加到上下文中?
  • 刚刚过去你的上下文类中的代码。您可能想要创建方法public
  • 完成。那行得通。
【解决方案2】:

只需枚举ChangeTracker.Entries 即可检查所有被跟踪的实体及其EntityEntry.State

【讨论】:

  • 谢谢。我能够看到被修改的模型。是否可以查看这些模型中的哪些属性也被修改了?
  • 是的,请参阅@Gert Arnold 答案中的代码。
猜你喜欢
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多