我一直在尝试按照 Ayende's blog 做一个非常简单的审计场景。当涉及到 IPreUpdateEventListener 和 IPreInsertEventListener 时,这似乎是每个人都引用的资源。
然而,无论我多么努力,我都无法让它发挥作用。该事件正确触发,当我通过它时一切看起来都不错,但没有向数据库发出我的“更改时间”的更新。
我在谷歌上搜索了大约一天,终于找到了答案 here .
当您将实体映射为 dynamic-update="true"时,它就不起作用了。果然,我就是这种情况。既然我很难找到这条信息,那么使用dynamic-update="true"是不是很少见?我们在所有实体上使用它。
由于这对我们来说是道路上的一个重大障碍,我想问一下是否有任何解决办法?
我一直在看 IInterceptor 但它总是被称为过时的,那么它的缺点是什么?此外,我还没有找到关于如何使用 IInterceptor 归档相同审计(带有插入/更新时间戳)的非常好的教程(我对 NHibernate 相当陌生)。
任何帮助,将不胜感激!
最佳答案
我遇到了这个确切的问题。这是我修复它的方式:
public class MyFlushEntityEventListener : DefaultFlushEntityEventListener
{
protected override void DirtyCheck(FlushEntityEvent e)
{
base.DirtyCheck(e);
if (e.DirtyProperties != null &&
e.DirtyProperties.Any() &&
//ITrackUpdate is my inteface for audited entities
e.Entity is ITrackUpdate)
e.DirtyProperties = e.DirtyProperties
.Concat(GetAdditionalDirtyProperties(e)).ToArray();
}
static IEnumerable<int> GetAdditionalDirtyProperties(FlushEntityEvent @event)
{
yield return Array.IndexOf(@event.EntityEntry.Persister.PropertyNames,
"UpdateTime");
yield return Array.IndexOf(@event.EntityEntry.Persister.PropertyNames,
"UpdateUser");
//You can add any additional properties here.
//Some of my entities do not track the user, for example.
}
}
然后,只需替换 NH 配置文件中的事件监听器:
<listener type="flush-entity"
class="MyFlushEntityEventListener, MyAssembly"/>
关于nhibernate - IPreUpdateEventListener 和动态更新 ="true",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5087888/