ORM内置审计跟踪

时间:2012-07-27 17:41:56

标签: c# asp.net-mvc orm audit-trail

我正在设计一个带有数据库后端的ASP.NET MVC Web应用程序,需要完整的审计跟踪以用于监管目的。

我过去实现了审计跟踪,但感觉我使用具有内置功能的ORM工具会更安全。看起来NHibernate会是一种方法 - 你能推荐其他选择吗?

澄清 - 我对辩论或ORM比较不感兴趣。我有效地询问ORM工具内置了对审计跟踪的支持。

1 个答案:

答案 0 :(得分:0)

我认为你可以在所有完整的ORM中拦截实际的数据库操作(但通常不会像微小的dapper那样)。您可以捕获新的记录,删除和修改,包括对象的原始和修改状态。

这是Linq2SQL中的一个示例,它使用Newtonsoft将特性转储到StringBuilder(将代码添加到DataContext类):

    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
    {
        var changes = GetChangeSet();
        var inserts = changes.Inserts;
        var deletes = changes.Deletes;
        var updates = changes.Updates;

        var sbLog = new StringBuilder();

        sbLog.AppendLine("Inserts:");
        sbLog.AppendLine(Newtonsoft.Json.JsonConvert.SerializeObject(inserts, Newtonsoft.Json.Formatting.Indented,
            new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }));

        sbLog.AppendLine("Deletes:");
        sbLog.AppendLine(Newtonsoft.Json.JsonConvert.SerializeObject(deletes, Newtonsoft.Json.Formatting.Indented,
            new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }));

        sbLog.AppendLine("Updates:");
        foreach(object x in updates) {
            var original = this.GetTable(x.GetType()).GetOriginalEntityState(x);

            sbLog.AppendLine(Newtonsoft.Json.JsonConvert.SerializeObject(new { original = original, mod = x },
                Newtonsoft.Json.Formatting.Indented,
                new Newtonsoft.Json.JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore }));
        }

        //"logger" can be anything, you use to log the changes...
        logger.Info(("db operations:" + Environment.NewLine + sbLog.ToString()).Replace(Environment.NewLine, Environment.NewLine + " | "));

        base.SubmitChanges(failureMode);
     }