我正在使用EF在MVC3应用程序中构建某种审计行为,我尝试了几种方法,试图避免对代码产生很大影响,当然,我们试图避免使用额外的代码。我可以,因为申请完成了35-ish%。
Audit
对象如下所示:
这个想法如下:
我创建了一个隐藏SaveChanges()
的部分课程并覆盖SaveChanges(SaveOptions)
。
然后我创建了两个相同方法的重载,以接收我的实体作为参数和/或不是SaveOptions
枚举参数。
新的SaveChanges()
除了显而易见之外,还设置了我的Audit
实体的属性,但问题出现在这里:我需要User
,Module
和{ {1}}。
我目前解决此问题的方法如下:
Operation
对象。Audit
设置为User
对象。Audit
。Operation
处理有效负载(在我的情况下为xml)。 ObjectStateManager
答案 0 :(得分:2)
另一种选择是使用自定义属性装饰要审核的数据库实体。在SaveChanges期间检查属性。对于模块和操作字段,您可以在此时捕获堆栈跟踪 - 从中查找调用控制器和操作。这有助于保持控制器清洁。
我在列级进行审核,而不是obejct。通常我只关心几列,而不是整个事情。作为参考,这是我的基础DbContext。我订阅了ObjectContext.SavingChanges事件,检查标记为已修改的所有内容,然后检查具有自定义[Audit]属性的任何属性。这可以很容易地扩展到也检查删除。