我正在设计一个带有数据库后端的 ASP.NET MVC Web 应用程序,该应用程序需要完整的审计跟踪以用于监管目的。
我过去已经实现了审计跟踪,但感觉使用带有内置功能的 ORM 工具会更安全。看起来 NHibernate 将是一种方法——你能推荐其他选择吗?
澄清一下 - 我对辩论或 ORM 比较不感兴趣。我实际上是在询问哪些 ORM 工具内置了对审计跟踪的支持。
我正在设计一个带有数据库后端的 ASP.NET MVC Web 应用程序,该应用程序需要完整的审计跟踪以用于监管目的。
我过去已经实现了审计跟踪,但感觉使用带有内置功能的 ORM 工具会更安全。看起来 NHibernate 将是一种方法——你能推荐其他选择吗?
澄清一下 - 我对辩论或 ORM 比较不感兴趣。我实际上是在询问哪些 ORM 工具内置了对审计跟踪的支持。
我认为您可以在所有完整的 ORM 中拦截实际的 db 操作(但通常不能在像 dapper 这样的微 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);
}