Ich möchte eine (Art) AudioLog hinzufügen, wenn ich Entitäten (vorläufiges Löschen) in Entity Framework 6 hinzufüge, ändere oder lösche. Ich habe SaveChanges überschrieben und da ich nur Protokolleinträge für hinzugefügte, geänderte oder gelöschte EntityStates hinzufügen möchte, rufe ich die Liste ab, bevor ich SaveChanges als erstes aufrufe Zeit. Das Problem besteht darin, dass ich den EntityState der Entitäten überprüfen muss, da ich protokollieren muss, welche Operation ausgeführt wurde. Aber nachdem SaveChanges aufgerufen wurde, ist der EntityState für alle Einträge Unchanged.
Code: Select all
public override int SaveChanges()
{
using (var scope = new TransactionScope())
{
var modifiedEntries = ChangeTracker.Entries()
.Where(e => e.State == EntityState.Added || e.State == EntityState.Deleted || e.State == EntityState.Modified)
.ToList();
int changes = base.SaveChanges();
foreach (var entry in modifiedEntries)
{
ApplyAuditLog(entry);
}
base.SaveChanges();
scope.Complete();
return changes;
}
}
private void ApplyAuditLog(DbEntityEntry entry)
{
ILog entity = entry.Entity as ILog;
if (entity != null)
{
LogOperation operation;
switch (entry.State)
{
case EntityState.Added:
operation = LogOperation.CreateEntity;
break;
case EntityState.Deleted:
operation = LogOperation.DeleteEntity;
break;
case EntityState.Modified:
operation = LogOperation.UpdateEntity;
break;
default:
throw new ArgumentOutOfRangeException();
}
AuditLog log = new AuditLog
{
Created = DateTime.Now,
Entity = entry.Entity.GetType().Name,
EntityId = entity.Id,
Operation = operation,
};
AuditLog.Add(log);
}
}
Mobile version