带内置审计跟踪的ORM

问题描述:

我正在设计一个带有数据库后端的ASP.NET MVC web应用程序,需要完整的审计跟踪以满足法规要求。带内置审计跟踪的ORM

我已经在过去实现了审计跟踪,但感觉像使用带有内置功能的ORM工具更安全。它看起来像NHibernate将是一种方式 - 你能推荐其他选项吗?

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

+1

如果你与像短小精悍迷你ORM去,你可以在您的应用程序中包含http://miniprofiler.com/。 – Alex 2012-07-27 17:47:52

+0

感谢您的建议,我认为miniprofiler可能会有用。如果您可以建议其他具有内置审计跟踪的ORM,我将有一个很好的起点来研究最佳选择。 – alexsome 2012-07-30 13:04:15

+0

我知道这不完全是你问的,但EventSourcing是另一种选择。那么持久性和审计线索是完全一样的。 – 2012-10-17 11:19:14

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

这里是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); 
    }