审核EF没有T4

时间:2012-08-23 16:06:40

标签: c# asp.net-mvc entity-framework audit

我正在使用EF在MVC3应用程序中构建某种审计行为,我尝试了几种方法,试图避免对代码产生很大影响,当然,我们试图避免使用额外的代码。我可以,因为申请完成了35-ish%。

Audit对象如下所示:

  • AuditId
  • 用户ID
  • OperationId
  • 的moduleId
  • 时间戳
  • 有效载荷
  • <模块>
  • <操作>
  • <用户>

这个想法如下:

我创建了一个隐藏SaveChanges()的部分课程并覆盖SaveChanges(SaveOptions)

然后我创建了两个相同方法的重载,以接收我的实体作为参数和/或不是SaveOptions枚举参数。

新的SaveChanges()除了显而易见之外,还设置了我的Audit实体的属性,但问题出现在这里:我需要UserModule和{ {1}}。

我目前解决此问题的方法如下:

  • 我在构造函数级别声明了一个Operation对象。
  • 在控制器的构造函数中,我将Audit设置为User对象。
  • 在每种方法中,我根据需要设置Audit
  • 在保存更改中,我从Operation处理有效负载(在我的情况下为xml)。

ObjectStateManager

1 个答案:

答案 0 :(得分:2)

另一种选择是使用自定义属性装饰要审核的数据库实体。在SaveChanges期间检查属性。对于模块和操作字段,您可以在此时捕获堆栈跟踪 - 从中​​查找调用控制器和操作。这有助于保持控制器清洁。

我在列级进行审核,而不是obejct。通常我只关心几列,而不是整个事情。作为参考,这是我的基础DbContext。我订阅了ObjectContext.SavingChanges事件,检查标记为已修改的所有内容,然后检查具有自定义[Audit]属性的任何属性。这可以很容易地扩展到也检查删除。