C# 审计环境足迹第T4号

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()除

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

Audit
对象如下所示:

  • 试听
  • 用户ID
  • 操作ID
  • 模块ID
  • 时间戳
  • 有效载荷
  • <操作>
其思路如下:

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

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

新的
SaveChanges()
除了明显的属性外,还设置了我的
审核
实体的属性,但问题发生在这里:我需要一个
用户
模块
和一个
操作

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

  • 我已经在构造函数类级别声明了一个
    Audit
    对象
  • 在控制器的构造函数中,我将
    User
    设置为我的
    Audit
    对象
  • 在每种方法中,我根据需要设置
    操作
  • 在保存更改中,我处理来自
    ObjectStateManager
    的有效负载(在我的例子中是xml)

我非常怀疑这种方法,它似乎对我的代码有点干扰。我在这里读了很多文章,但没有一篇帮助我改进这种方法,也没有决定改变它。因此,请避免链接我可能已经读过的内容。

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


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

最好在数据库级别使用触发器进行审计。