NHibernate – 如何审计实体的所有字段?

我正在使用NHibernate并寻找一种解决方案,允许我审核实体中所有字段的更改。 我希望能够为每个实体创建一个历史表,即Users – > UsersHistory,它将具有与Users表相同的结构,以及其他字段,如操作类型(更新,删除),进行更改的用户的用户ID等。我不想为每个实体定义这样的类。 我正在寻找像History (即History )之类的东西,因为这些条目不属于我的域,只会用于准备对实体所做的更改列表。 我还认为在代码中创建对这些表的插入更好,而不是创建sql触发器。 基本上,我只需要在更新或删除时在历史表中创建记录副本,我希望NHibernate生成插入。 我还需要从历史表中读取记录 – 正如我所说,这些表将包含实体字段和一些常见的历史字段。

我找不到有关如何创建此类解决方案的指导。 我所能找到的只是添加UserModified,UpdatedTimestamp等,如果我已经在实体上有这样的字段。 但是,我需要实体的完整历史记录,而不仅仅是最后更改条目的信息。

在此先感谢您的帮助。

NHibernate有一个很酷的开源审计跟踪,叫做nhibernate.envers https://bitbucket.org/RogerKratz/nhibernate.envers ,所以你不必重新发明轮子。

它透明地集成到NHibernate中,不会对您的域模型或映射进行任何更改。

它就像添加引用和调用一样简单:

 var enversConf = new FluentConfiguration(); enversConf.Audit(); nhConf.IntegrateWithEnvers(enversConf); 

nhConf是你的NHibernate配置对象。

对于对象的每个更改都会创建一个新修订,您可以通过调用以下命令让Envers检索修订:

 var reader = AuditReaderFactory.Get(session); var userInRevOne = reader.Find(user.Id, 1); 

或列出所有修订版本等。修订版数据本身可以使用用户名,用户ID,时间戳等(无论你能想到什么)进行丰富。

编辑:它可以在NuGet上找到: http : //nuget.org/packages/NHibernate.Envers

我认为最好的解决方案是使用事件监听器:

http://darrell.mozingo.net/2009/08/31/auditing-with-nhibernate-listeners/

我写了类似于上面的内容(在找到该博客后进行了修改),除了我将结果存储在XML中。

例如:

 public void OnPostUpdate(PostUpdateEvent updateEvent) { if (updateEvent.Entity is AuditItem) return; var dirtyFieldIndexes = updateEvent.Persister.FindDirty(updateEvent.State, updateEvent.OldState, updateEvent.Entity, updateEvent.Session); var data = new XElement("AuditedData"); foreach (var dirtyFieldIndex in dirtyFieldIndexes) { var oldValue = GetStringValueFromStateArray(updateEvent.OldState, dirtyFieldIndex); var newValue = GetStringValueFromStateArray(updateEvent.State, dirtyFieldIndex); if (oldValue == newValue) { continue; } data.Add(new XElement("Item", new XAttribute("Property", updateEvent.Persister.PropertyNames[dirtyFieldIndex]), new XElement("OldValue", oldValue), new XElement("NewValue", newValue) )); } AuditService.Record(data, updateEvent.Entity, AuditType.Update); } 

审计服务只是构建添加一些其他数据,如IP地址,用户(如果有),是系统/服务更新还是通过网站或用户进行操作等。

然后在我的DB中存储XML,如:

   above average godly   Phill Phillip   

我也有插入/删除监听器。

您正在寻找的是事件监听器(遗憾的是我无法链接到相关文档,因为nhforge.org wiki正在体验NRE ……)。

检查复杂的NHibernate审计

以下是如何执行此操作的完整示例: http : //www.shawnduggan.com/?p = 89 。

本文还介绍了: 审计日志记录nhibernate