Я некоторое время боролся с проблемой, которая заключается в аудите общих объектов базы данных при их сохранении. У меня есть проект, который использует EF 6, и мне потребовалось создать «неинвазивный» метод для аудита объектов, когда они будут добавлены, изменены или удалены. Я должен хранить JSON вставленного объекта, измененного объекта или удаленного объекта, не мешая нормальному потоку. Проект имеет реализацию Database First.Аудит Entity Framework удаленные записи, сохраняющие предыдущее значение
Мое решение было простым, добавьте частичный класс любого объекта, который остальная часть программистов хочет провести аудит внедрения IAudit, который в основном представляет собой пустой интерфейс для получения всех изменений от объектов, которые его реализуют.
public interface IAudit {}
У меня есть сущность валюты, только реализовать его без какого-либо другого кода (я мог бы сделать что-то еще в будущем, но я не нужен)
public partial class Currencies : IAudit
Я переопределить метод SaveChanges к искать для субъектов аудита
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
// This linq looks for new entities that were marked for audit
CreateAuditLog(System.Data.Entity.EntityState.Added);
CreateAuditLog(System.Data.Entity.EntityState.Modified);
CreateAuditLog(System.Data.Entity.EntityState.Deleted);
return base.SaveChanges();
}
решение вызывает в 3 раза CreateAuditLog потому, что в ближайшем будущем мне нужно реализовать конфигурацию для аудита любой пользователь решает, может быть фр om конфигурация базы данных, которая активируется/деактивируется пользователями.
Все работало отлично, я был в состоянии получить сохраненные объекты в указанном состоянии:
private void CreateAuditLog(System.Data.Entity.EntityState state)
{
var auditedEntities = ChangeTracker.Entries<IAudit>()
.Where(p => p.State == state)
.Select(p => p.Entity);
... some code that do something else
foreach (var auditedEntity in auditedEntities)
{
... some information I required to add
strJSON = JsonConvert.SerializeObject(auditedEntity, new EFNavigationPropertyConverter());
... some code to save audit information
}
}
Проблема в том я теряю каждое значение в Удаляются состояние, я получаю только идентификатор, нет никакой информации в свойства, за исключением идентификатора, и нет никакой возможности его извлечь. Я искал каждое решение в StackOverflow и других веб-сайтах, и восстановить исходную информацию нечего. Как я могу получить предыдущие удаленные значения для их хранения так же, как я храню Добавленные и измененные объекты?
Я работаю над библиотекой, которая может помочь. Взгляните на библиотеку [Audit.EntityFramework] (https://www.nuget.org/packages/Audit.entityframework/), она перехватывает SaveChanges() и может быть настроена для фильтрации объектов, которые вы хотите проверить. – thepirat000