【发布时间】:2016-11-21 19:51:48
【问题描述】:
我一直在努力解决一个问题,即在保存数据库实体时对其进行一般审计。我有一个使用 EF 6 的项目,我需要创建一种“非侵入性”方法来在添加、修改或删除实体时对其进行审计。我必须在不干扰正常流程的情况下存储插入实体、修改实体或删除实体的 JSON。该项目有一个 Database First 实现。
我的解决方案很简单,添加其他程序员想要审核实施 IAudi 的任何实体的部分类,这基本上是一个空接口,用于从实现它的实体获取所有更改。
public interface IAudit {}
我有一个 Currencies 实体,它只是在没有任何其他代码的情况下实现它(我将来可以做其他事情,但我不需要它)
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,因为在不久的将来我需要实施一个配置来审核用户决定的任何内容,可能来自用户激活/停用的数据库配置。
一切都很顺利,我能够在指定状态下保存实体:
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
}
}
问题是我在 Deleted 状态下丢失了所有值,我只获得了 ID,除了 ID 之外,属性中没有任何信息,并且不可能以任何方式提取它。我在 StackOverflow 和其他网站上寻找了每一个解决方案,但没有任何东西可以恢复原始信息。 如何获取以前删除的值以存储它们的方式与存储已添加和已修改实体的方式相同?
【问题讨论】:
-
我一直在研究一个可能会有所帮助的库。看看Audit.EntityFramework 库,它会拦截 SaveChanges() 并且可以配置为过滤您要审核的实体。
标签: c# entity-framework audit