1

我正在使用 EF 在 MVC3 应用程序中构建某种审计行为,并且我尝试了几种方法,试图避免对代码的高影响,当然,尽量避免额外的代码,因为申请已经完成了 35%。

Audit对象看起来像这样:

  • 审计 ID
  • 用户身份
  • 操作 ID
  • 模块 ID
  • 时间戳
  • 有效载荷
  • < 模块 >
  • < 操作 >
  • <用户>

思路如下:

我创建了一个部分类来隐藏SaveChanges()和覆盖SaveChanges(SaveOptions)

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

除了明显之外,新SaveChanges()的设置了我的实体的属性Audit,但问题发生在这里:我需要 aUserModulean Operation

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

  • 我已经Audit在构造函数类级别声明了一个对象。
  • 在控制器的构造函数中,我将 设置User为我的Audit对象。
  • 在每种方法中,我都Operation根据需要设置。
  • 在保存更改中,我处理来自ObjectStateManager.

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.

4

1 回答 1

2

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

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

于 2012-08-23T16:54:05.940 回答