【发布时间】:2015-09-15 23:52:33
【问题描述】:
我有一个跟踪添加、删除和修改的审计表。由于多种原因,我在实体框架中跟踪这一点,而不是使用数据库触发器,但实际上是因为我们使用了进程帐户,并且我想跟踪哪些用户对该记录进行了物理更改。
我曾在 EF 5 中使用过此功能,但我不记得我可能也在 EF6 中使用过它。无论哪种方式,我都在尝试捕获原始值的 EF 7 中度过最艰难的时期。
我注意到当我在手表中时 - 我可以看到非公开成员内部的原始值 - 所以在我的脑海中我知道它必须存在于某个地方。
最终这在 EF 早期版本中有效:
EntityEntry dbEntry; //this is actually passed in a different area just showing as an example.
foreach (string propertyName in dbEntry.OriginalValues.PropertyNames)
{
// For updates, we only want to capture the columns that actually changed
if (!object.Equals(dbEntry.OriginalValues.GetValue<object>(propertyName), dbEntry.CurrentValues.GetValue<object>(propertyName)))
{
result.Add(new TableChange()
{
AuditLogID = Guid.NewGuid(),
UserID = userId,
EventDateUTC = changeTime,
EventType = "M", // Modified
TableName = tableName,
RecordID = dbEntry.OriginalValues.GetValue<object>(keyName).ToString(),
ColumnName = propertyName,
OriginalValue = dbEntry.OriginalValues.GetValue<object>(propertyName) == null ? null : dbEntry.OriginalValues.GetValue<object>(propertyName).ToString(),
NewValue = dbEntry.CurrentValues.GetValue<object>(propertyName) == null ? null : dbEntry.CurrentValues.GetValue<object>(propertyName).ToString()
}
);
}
}
我得到的错误是 EntityEntry 不包含 OriginalValues 的定义。我要拔头发了...如何使用 EF 7 从修改后的对象中获取原始值?
【问题讨论】:
-
有DbEntityEntry 包含
OriginalValues。您可以使用DbContext.Entry<TEntity> 方法获取它。 -
@ieaglle 那是 EntityFramework 5/6
-
哦,对了,那你的答案是正确的。 PropertyEntry 包含
OriginalValue和 EntityEntry 包含返回PropertyEntry的方法 Property。
标签: c# .net entity-framework entity-framework-core