我知道那里有几个类似的帖子,但我找不到任何解决此问题的帖子。
我想在实体框架 6 中添加、更改或删除实体(软删除)时添加(某种)AudioLog。我已经覆盖了 SaveChanges,因为我只想为添加、修改或删除的 EntityStates 添加日志条目,我在第一次调用 SaveChanges 之前获取列表。问题是,因为我需要记录已执行的操作,所以我需要检查实体的 EntityState。但是在调用 SaveChanges 后,所有条目的 EntityState 都保持不变。
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);
}
}
啊啊……当然啦!!对于新添加的实体来说,id 只会成为一个“问题”,因此通过将列表分为两部分(一个用于修改/删除,一个用于添加),我分两个阶段创建 AuditLog。
对于想要应用这种 AuditLog 的其他人,这是我的工作代码:
public override int SaveChanges()
{
using (var scope = new TransactionScope())
{
var addedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Added).ToList();
var modifiedEntries = ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted || e.State == EntityState.Modified).ToList();
foreach (var entry in modifiedEntries)
{
ApplyAuditLog(entry);
}
int changes = base.SaveChanges();
foreach (var entry in addedEntries)
{
ApplyAuditLog(entry, LogOperation.CreateEntity);
}
base.SaveChanges();
scope.Complete();
return changes;
}
}
private void ApplyAuditLog(DbEntityEntry entry)
{
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();
}
ApplyAuditLog(entry, operation);
}
private void ApplyAuditLog(DbEntityEntry entry, LogOperation logOperation)
{
ILog entity = entry.Entity as ILog;
if (entity != null)
{
AuditLog log = new AuditLog
{
Created = DateTime.Now,
Entity = entry.Entity.GetType().Name,
EntityId = entity.Id,
Operation = logOperation,
};
AuditLog.Add(log);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)