У меня есть таблица аудита, в которой отслеживаются Добавленные, Удаленные и Модифицированные. Я отслеживаю это внутри Entity Framework вместо использования триггера Database по нескольким причинам, но на самом деле потому, что мы используем учетную запись Process, и я хочу отслеживать, какой пользователь физически сделал это изменение для этой записи.Показать исходные значения Entity Framework 7
У меня было это работает с 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 не содержит defition для OriginalValues. Я собираюсь вытащить свои волосы ... Как получить исходные значения из измененного объекта с помощью EF 7?
есть [DbEntityEntry] (https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry (v = vs.113) .aspx), который содержит ' OriginalValues'. вы можете получить его с помощью метода [DbContext.Entry] (https://msdn.microsoft.com/en-us/library/gg696578 (v = vs.113) .aspx). –
ieaglle
@ieaglle that's EntityFramework 5/6 –
О, правильно, тогда ваш ответ правильный. [PropertyEntry] (https://github.com/aspnet/EntityFramework/blob/868794f6ab99ff1681a09a2a5e307a742e9d0526/src/EntityFramework.Core/ChangeTracking/PropertyEntry%60.cs) содержит 'OriginalValue' и [EntityEntry] (https://github.com). /aspnet/EntityFramework/blob/868794f6ab99ff1681a09a2a5e307a742e9d0526/src/EntityFramework.Core/ChangeTracking/EntityEntry.cs) содержит метод [Свойства] (https://github.com/aspnet/EntityFramework/blob/868794f6ab99ff1681a09a2a5e307a742e9d0526/src/EntityFramework.Core/ChangeTracking /EntityEntry.cs#L91), который возвращает 'PropertyEntry'. – ieaglle