EF6每个实体的代码优先审计表

本文关键字:审计 代码 实体 EF6 | 更新日期: 2023-09-27 17:54:12

我有一个需求,感觉它可能有一个比我们目前使用的更简单的解决方案。

本质上,作为审计需求,对于从给定基类继承的任何实体,我需要创建实体本身的表,但也需要创建一个相同的表,但有3个额外的列-一个FK返回到原始实体的表,一个描述(例如:"修改"、"添加"、"删除")和一个包含实体状态序列化版本的XML列。

目前,我们正在手动添加实体来创建审计表(目前从AuditableEntity类继承,开发人员必须手动确保其他字段与原始实体匹配),并使用迁移向实体表添加T-SQL触发器来更新任何插入,更新,删除审计表中的数据。

如果我能以某种方式让EF基于实体表自动创建/迁移审计表,而不必手动同步它们,我更喜欢,同样地,使用拦截器或类似的东西在实体的插入/更新/删除时更新审计表,而不是使用触发器。有人知道这是可能的吗,或者做过类似的事情吗?在过去,我最接近的是一个单一的、通用的审计历史表,它还不错。

EF6每个实体的代码优先审计表

免责声明:我是项目Entity Framework Plus的所有者

这个项目可能符合你的要求。您可以访问所有审计信息,如实体名称,操作名称,属性名称,原始值和当前值等。

有很多选项可用,比如自动保存数据库中的所有信息。

// using Z.EntityFramework.Plus; // Don't forget to include this.
var ctx = new EntityContext();
// ... ctx changes ...
var audit = new Audit();
audit.CreatedBy = "ZZZ Projects"; // Optional
ctx.SaveChanges(audit);
// Access to all auditing information
var entries = audit.Entries;
foreach(var entry in entries)
{
    foreach(var property in entry.Properties)
    {
    }
}

文档:EF+ Audit

您可以创建一个包含以下列的表:

  • Id
  • 动作(添加、更新、删除)
  • IdOfRecord
  • xmlserialize
  • DateChanges (use datetime2)

然后重写SaveChanges()将每个更改写入该表。

不需要在运行迁移等时保持审计表模式是最新的。