我一直在尝试在Ayende's blog之后执行一个非常简单的审计方案,这似乎是每个人在IPreUpdateEventListener和IPreInsertEventListener时所引用的资源。
然而无论我怎么努力,我都无法让它发挥作用。事件正确启动,当我介入时,一切看起来都没问题,但是我的“更改时间”没有更新到数据库。
我花了一天时间在Google上搜索,最后找到答案here。
当您使用dynamic-update =“true”映射实体时,它将无法工作。果然,对我来说就是这样。既然我很难找到这条信息,那么使用dynamic-update =“true”是不常见的?我们在所有实体上使用它。
由于这对我们来说是一个重大障碍,我想问一下这有什么办法吗?
我一直在关注IInterceptor,但它总是被称为过时,所以这有什么缺点?另外,我还没有找到一个关于如何使用IInterceptor进行相同审计(使用插入/更新时间戳)的非常好的教程(我对NHibernate来说相当新)。
任何帮助将不胜感激!
答案 0 :(得分:10)
我遇到了这个问题。这就是我修复它的方法:
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"/>
答案 1 :(得分:1)
我遇到了同样的问题,但是我发现我可以使用OnFlushDirty
来处理它。