我有一个跟踪添加、删除和修改的审计表。出于多种原因,我在 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/

10-11 09:00