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

时间:2015-06-08 16:28:06

标签: c# sql-server entity-framework ef-code-first entity-framework-6

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

基本上,作为审计要求,对于从给定基类继承的任何实体,我需要创建实体表本身,但也需要创建一个相同的表,但另外还有3个表columns - FK返回原始实体的表,描述(例如" Modified"," Added"," Deleted")和XML列它将包含实体状态的序列化版本。

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

如果我能够以某种方式让EF根据实体表自动创建/迁移审计表而不必手动同步它们,并且同样使用拦截器或类似的东西来更新插入的审计表,我更喜欢/更新/删除实体而不是使用触发器。有谁知道这是可能的,还是做了类似的事情?在过去,我最接近的是一个单一的,通用的审计历史表,并不是太糟糕。

2 个答案:

答案 0 :(得分:1)

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

  • 编号
  • 表名
  • 操作(添加,更新,删除)
  • IdOfRecord
  • XmlSerialized
  • DateChanges(使用datetime2)

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

无需在运行迁移等时保持审核表架构的最新状态

答案 1 :(得分:1)

免责声明:我是该项目的所有者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