在 Entity Framework 中,如何在保存前查看更改?
In Entity Framework, how can I see changes before saving?
是否有一种方法可以调用 Entity Framework 来查看已更改(在内存中)并在调用 SaveChanges 时将写入磁盘的数据?
我想向用户显示一些内容,表明有未保存的更改。 Table 级别没问题,但我更想知道某个 field/column 是否有未保存的更改。
简单枚举ChangeTracker.Entries to examine all the tracked entities, and their EntityEntry.State.
例如,将此方法添加到您的上下文中:
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
)
)));
}
它 returns 添加、修改或删除了实体对象,列出了它们的 class 名称(不是 table 名称)及其属性,以及原始值和当前值。还包括键值,以便能够区分相同类型的对象。
在修改的实体中,仅列出更改的属性。
是否有一种方法可以调用 Entity Framework 来查看已更改(在内存中)并在调用 SaveChanges 时将写入磁盘的数据?
我想向用户显示一些内容,表明有未保存的更改。 Table 级别没问题,但我更想知道某个 field/column 是否有未保存的更改。
简单枚举ChangeTracker.Entries to examine all the tracked entities, and their EntityEntry.State.
例如,将此方法添加到您的上下文中:
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
)
)));
}
它 returns 添加、修改或删除了实体对象,列出了它们的 class 名称(不是 table 名称)及其属性,以及原始值和当前值。还包括键值,以便能够区分相同类型的对象。
在修改的实体中,仅列出更改的属性。