一尘不染

NHibernate-如何审核实体的所有字段?

hibernate

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

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

在此先感谢您的帮助。


阅读 200

收藏
2020-06-20

共1个答案

一尘不染

NHibernate有一个很酷的开源审计跟踪,称为nhibernate.envers
https://bitbucket.org/RogerKratz/nhibernate.envers,因此您不必重新发明轮子。

它透明地集成到NHibernate中,无需更改域模型或映射。

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

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

nhConf您的NHibernate配置对象。

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

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

或列出所有修订等。修订数据本身可以包含用户名,用户ID,时间戳等(无论您认为如何)。

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

2020-06-20