我正在使用NHibernate,并且正在寻找一种解决方案,该解决方案将允许我审核实体中所有字段的更改。我希望能够为每个实体(例如,用户-> UsersHistory)创建一个历史表,该表将具有与用户表相同的结构,并具有其他字段,例如操作类型(更新,删除),进行更改的用户的userid等。不想为每个实体定义此类。我正在寻找类似的东西History<T>(即History<User>),因为这些条目不属于我的域,仅用于准备对该实体所做的更改的列表。我还认为,最好用代码在这些表中创建插入,而不是创建sql触发器。基本上,我只需要在更新或删除时在历史表中创建记录的副本,并且我想由NHibernate生成插入。我还需要从历史记录表中读取记录- 正如我所说的,这些表将由实体字段和一些常见的历史记录字段组成。
History<T>
History<User>
我找不到有关如何创建此类解决方案的指南。我所能找到的就是添加UserModified,UpdatedTimestamp等(如果我已经在实体上拥有此类字段)。但是,我需要实体的完整历史记录,而不仅仅是最后更改条目的信息。
在此先感谢您的帮助。
NHibernate有一个很酷的开源审计跟踪,称为nhibernate.envers https://bitbucket.org/RogerKratz/nhibernate.envers,因此您不必重新发明轮子。
它透明地集成到NHibernate中,无需更改域模型或映射。
就像添加引用和调用一样简单:
var enversConf = new FluentConfiguration(); enversConf.Audit<User>(); nhConf.IntegrateWithEnvers(enversConf);
而nhConf您的NHibernate配置对象。
nhConf
对于对象上的每个更改,都会创建一个新修订版本,您可以通过调用以下命令要求Envers检索修订版本:
var reader = AuditReaderFactory.Get(session); var userInRevOne = reader.Find<User>(user.Id, 1);
或列出所有修订等。修订数据本身可以包含用户名,用户ID,时间戳等(无论您认为如何)。
编辑:它可以在NuGet上找到:http : //nuget.org/packages/NHibernate.Envers