2012-08-23 39 views
1

我正在EF中使用MVC3应用程序构建某种审计行为,并且我尝试了几种方法,试图避免对代码造成严重影响,当然,还试图避免尽可能多的额外代码,因为应用程序完成了35%的工作。审计EF没有T4

Audit对象看起来像这样:

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

的想法去如下:

我创建了一个局部类隐藏SaveChanges()并覆盖SaveChanges(SaveOptions)

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

除了明显的新SaveChanges(),将我的Audit实体的属性,但这里的问题发生:我需要一个UserModuleOperation

我目前的解决方案来解决这个问题如下:

  • 我已经声明在构造函数类水平的Audit对象。
  • 在控制器的构造函数中,我将User设置为我的Audit对象。
  • 在每种方法中,我根据需要设置Operation
  • 在保存更改中,我处理来自ObjectStateManager的有效负载(在本例中为xml)。

I'm very skeptic about this approach, it seems to be a little intrusive to my code. I've read lots of posts here in SO, but none of them helped me to improve this approach nor decide to change it. So please avoid linking things I've probably already read.

+0

审计最好在数据库级别使用触发器完成。 –

回答

2

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

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