我有一个跟踪添加、删除和修改的审计表。出于多种原因,我在 Entity Framework 中跟踪它而不是使用数据库触发器,但实际上是因为我们使用进程帐户,并且我想跟踪哪个用户对该记录进行了物理更改。
我在 EF 5 中使用过它,我不记得我可能在 EF6 中也使用过它。无论哪种方式,我都在 try catch 原始值的 EF 7 中度过了最艰难的时光。
我注意到当我在 watch 中时 - 我可以看到非公开成员内部的原始值(value) - 所以在我的脑海中我知道它必须存在于某个地方。
最终这适用于 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 从修改后的对象中获取原始值?
最佳答案
// using System.Reflection;
foreach (var property in dbEntry.Entity.GetType().GetTypeInfo().DeclaredProperties)
{
var originalValue = dbEntry.Property(property.Name).OriginalValue;
var currentValue = dbEntry.Property(property.Name).CurrentValue;
Console.WriteLine($"{property.Name}: Original: {originalValue}, Current: {currentValue}");
}
关于c# - 显示原始值 Entity Framework 7,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32597498/