显示原始值entity framework7

我有一个审计表,跟踪添加,删除和修改。 我在entity framework内跟踪这个而不是使用数据库触发器有多种原因,但实际上是因为我们使用了一个进程账户,我想跟踪用户物理上对该记录进行了哪些更改。

我有这个与EF 5合作,我不记得我可能已经在EF6工作了。 无论哪种方式,我都在努力尝试捕捉原始值。

我注意到,当我在观察时 – 我可以在非公众成员中看到原始价值 – 所以在我的脑海里,我知道它必须存在于某个地方。

最终这适用于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(propertyName), dbEntry.CurrentValues.GetValue(propertyName))) { result.Add(new TableChange() { AuditLogID = Guid.NewGuid(), UserID = userId, EventDateUTC = changeTime, EventType = "M", // Modified TableName = tableName, RecordID = dbEntry.OriginalValues.GetValue(keyName).ToString(), ColumnName = propertyName, OriginalValue = dbEntry.OriginalValues.GetValue(propertyName) == null ? null : dbEntry.OriginalValues.GetValue(propertyName).ToString(), NewValue = dbEntry.CurrentValues.GetValue(propertyName) == null ? null : dbEntry.CurrentValues.GetValue(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}"); } 

另一个选择是仍然使用OriginalValues ,但不使用PropertyNames ,而是使用Properties 。 这将使foreach循环过程类型为Microsoft.EntityFrameworkCore.Metadata.IPropertyGetValues方法有一个接受IProperty的重载,因此这些调用的代码不需要更改,但是您需要将ColumnName赋值从propertyName更改为property 名字

 foreach (var property in entityEntry.OriginalValues.Properties) { if (!object.Equals(entityEntry.OriginalValues.GetValue(property), entityEntry.CurrentValues.GetValue(property))) { result.Add( new AuditLog() { UserId = userId, EventDate = changeTime, EventType = "M", TableName = tableName, RecordId = entityEntry.OriginalValues.GetValue(keyName).ToString(), ColumnName = property.Name, OriginalValue = entityEntry.OriginalValues.GetValue(property) == null ? null : entityEntry.OriginalValues.GetValue(property).ToString(), NewValue = entityEntry.CurrentValues.GetValue(property) == null ? null : entityEntry.CurrentValues.GetValue(property).ToString() }); } }