同様の投稿がいくつかあることは知っていますが、この問題の解決策を見つけることができません。
Entity Framework 6 でエンティティを追加、変更、または削除 (ソフト削除) するときに、(一種の) AudioLog を追加したいと考えています。 SaveChanges を初めて呼び出す前に、リストをフェッチします。問題は、実行された操作をログに記録する必要があるため、エンティティの EntityState を検査する必要があることです。ただし、SaveChanges が呼び出された後は、すべてのエントリの EntityState が Unchanged になります。
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);
}
}