顯示原始值實體框架7

.net c# entity-framework entity-framework-core

我有一個審計表,跟踪添加,刪除和修改。我在實體框架內跟踪這個而不是使用數據庫觸發器有多種原因,但實際上是因為我們使用了一個進程賬戶,我想跟踪用戶物理上對該記錄進行了哪些更改。

我有這個與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<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}");
}

熱門答案

另一個選擇是仍然使用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<object>(property), 
        entityEntry.CurrentValues.GetValue<object>(property)))
    {
        result.Add(
            new AuditLog()
            {
                UserId = userId,
                EventDate = changeTime,
                EventType = "M",
                TableName = tableName,
                RecordId = entityEntry.OriginalValues.GetValue<object>(keyName).ToString(),
                ColumnName = property.Name,
                OriginalValue =
                    entityEntry.OriginalValues.GetValue<object>(property) == null
                    ? null
                    : entityEntry.OriginalValues.GetValue<object>(property).ToString(),
                NewValue = 
                    entityEntry.CurrentValues.GetValue<object>(property) == null
                    ? null
                    : entityEntry.CurrentValues.GetValue<object>(property).ToString()
        });
    }
}



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因