【发布时间】:2022-01-04 19:48:05
【问题描述】:
是否有一种方法可以在实体框架中调用以查看已更改(在内存中)并在调用 SaveChanges 时将写入磁盘的数据?
我想向用户显示一些内容,表明存在未保存的更改。表级别还可以,但我想知道特定字段/列是否有未保存的更改。
【问题讨论】:
-
请详细描述您对哪些变化感兴趣以及为什么需要了解这些变化。
标签: entity-framework entity-framework-core
是否有一种方法可以在实体框架中调用以查看已更改(在内存中)并在调用 SaveChanges 时将写入磁盘的数据?
我想向用户显示一些内容,表明存在未保存的更改。表级别还可以,但我想知道特定字段/列是否有未保存的更改。
【问题讨论】:
标签: entity-framework entity-framework-core
例如,将此方法添加到您的上下文中:
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。
只需枚举ChangeTracker.Entries 即可检查所有被跟踪的实体及其EntityEntry.State。
【讨论】: