如何从Entity Framework 6中的Auditlog实体获取id

我知道那里有几个类似的post,但我找不到任何解决这个问题的方法。

我想在Entity Framework 6中添加,更改或删除实体(软删除)时添加(某种)AudioLog。我已经覆盖了SaveChanges,因为我只想为EntityStates添加,修改或删除的日志条目,我在第一次调用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); } } 

啊……当然!! 对于新添加的实体,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); } } 
Interesting Posts