emp*_*mpi 9 .net c# nhibernate hibernate
我正在使用NHibernate并寻找一种解决方案,允许我审核实体中所有字段的更改.我希望能够为每个实体创建一个历史表,即Users - > UsersHistory,它将具有与Users表相同的结构以及其他字段,例如操作类型(更新,删除),进行更改的用户的用户ID等.我不想为每个实体定义这样的类.我正在寻找类似History<T>(即History<User>)的东西,因为这些条目不属于我的域,只会用于准备对实体所做的更改列表.我还认为在代码中创建对这些表的插入更好,而不是创建sql触发器.基本上,我只需要在更新或删除时在历史表中创建记录副本,我希望NHibernate生成插入.我还需要从历史表中读取记录 - 正如我所说,这些表将包含实体字段和一些常见的历史字段.
我找不到有关如何创建此类解决方案的指导.我所能找到的只是添加UserModified,UpdatedTimestamp等,如果我已经在实体上有这样的字段.但是,我需要实体的完整历史记录,而不仅仅是最后更改条目的信息.
在此先感谢您的帮助.
And*_*eas 15
有凉的,开源的审核跟踪用于NHibernate的所谓nhibernate.envers https://bitbucket.org/RogerKratz/nhibernate.envers,所以你不必推倒重来.
它透明地集成到NHibernate中,不会对您的域模型或映射进行任何更改.
它就像添加引用和调用一样简单:
var enversConf = new FluentConfiguration();
enversConf.Audit<User>();
nhConf.IntegrateWithEnvers(enversConf);
Run Code Online (Sandbox Code Playgroud)
而nhConf你的NHibernate配置对象.
对于对象的每个更改都会创建一个新修订,您可以通过调用以下命令让Envers检索修订:
var reader = AuditReaderFactory.Get(session);
var userInRevOne = reader.Find<User>(user.Id, 1);
Run Code Online (Sandbox Code Playgroud)
或列出所有修订版本等.修订版数据本身可以使用用户名,用户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);
}
Run Code Online (Sandbox Code Playgroud)
审计服务只是构建添加一些其他数据,如IP地址,用户(如果有),是系统/服务更新还是通过网站或用户进行操作等.
然后在我的DB中存储XML,如:
<AuditedData>
<Item Property="Awesomeness">
<OldValue>above average</OldValue>
<NewValue>godly</NewValue>
</Item>
<Item Property="Name">
<OldValue>Phill</OldValue>
<NewValue>Phillip</NewValue>
</Item>
</AuditedData>
Run Code Online (Sandbox Code Playgroud)
我也有插入/删除监听器.
| 归档时间: |
|
| 查看次数: |
7953 次 |
| 最近记录: |