C# 审计环境足迹第T4号
我正在用EF在MVC3应用程序中构建某种审计行为,我尝试了几种方法,试图避免对代码造成严重影响,当然,我也尽量避免额外的代码,因为应用程序已经完成了35%C# 审计环境足迹第T4号,c#,asp.net-mvc,entity-framework,audit,C#,Asp.net Mvc,Entity Framework,Audit,我正在用EF在MVC3应用程序中构建某种审计行为,我尝试了几种方法,试图避免对代码造成严重影响,当然,我也尽量避免额外的代码,因为应用程序已经完成了35% Audit对象如下所示: 试听 用户ID 操作ID 模块ID 时间戳 有效载荷 其思路如下: 我创建了一个分部类来隐藏SaveChanges()并覆盖SaveChanges(SaveOptions) 然后,我又创建了两个相同方法的重载,以将实体作为参数和/或不是SaveOptionsenum参数接收 新的SaveChanges()除
Audit
对象如下所示:
- 试听
- 用户ID
- 操作ID
- 模块ID
- 时间戳
- 有效载荷
- <操作>
SaveChanges()
并覆盖SaveChanges(SaveOptions)
然后,我又创建了两个相同方法的重载,以将实体作为参数和/或不是SaveOptions
enum参数接收
新的SaveChanges()
除了明显的属性外,还设置了我的审核
实体的属性,但问题发生在这里:我需要一个用户
,模块
和一个操作
我目前解决此问题的解决方案如下:
- 我已经在构造函数类级别声明了一个
对象Audit
- 在控制器的构造函数中,我将
设置为我的User
对象Audit
- 在每种方法中,我根据需要设置
操作
- 在保存更改中,我处理来自
的有效负载(在我的例子中是xml)ObjectStateManager
我非常怀疑这种方法,它似乎对我的代码有点干扰。我在这里读了很多文章,但没有一篇帮助我改进这种方法,也没有决定改变它。因此,请避免链接我可能已经读过的内容。
另一个选择是使用自定义属性装饰您希望审核的数据库实体。在保存更改期间检查属性。对于模块和操作字段,您可以捕获当时的堆栈跟踪—从中查找调用控制器和操作。这将有助于保持控制器的清洁
我在列级别进行审核,而不是obejct。通常我只关心几个专栏,而不关心整个内容。作为参考,这里是我的基地。我订阅ObjectContext.SavingChanges事件,检查标记为已修改的所有内容,然后检查具有自定义[Audit]属性的任何属性。这可以很容易地扩展以检查删除。最好在数据库级别使用触发器进行审计。