[英]Misplaced call `OnPreUpdate` in Auditor Event listener implementation in NHibernate
我有一个使用NHibernate 3的项目。我在NHibernate中使用了Auditor Event Listener
来修剪实体中的字符串属性。
我的代码是:
public class AuditorEventListener : IPreInsertEventListener, IPreUpdateEventListener
{
public bool OnPreInsert(PreInsertEvent preInsertEvent)
{
Correction(preInsertEvent.Entity);
return false;
}
public bool OnPreUpdate(PreUpdateEvent preUpdateEvent)
{
Correction(preUpdateEvent.Entity);
return false;
}
internal static void Correction(object entity)
{
var properties = entity.GetType().GetProperties().Where(p => p.PropertyType == typeof(String));
foreach (var item in properties)
{
var result = item.GetValue(entity, null).ToString();
result = result.Trim();
item.SetValue(entity, result, null);
}
}
}
NHibernate的配置是:
<event type="pre-insert">
<listener class="NS.NHibernate.AuditorEventListener, NS.NHibernate" />
</event>
<event type="pre-update">
<listener class="NS.NHibernate.AuditorEventListener, NS.NHibernate" />
</event>
我使用以下命令保存和更新实体:
SessionInstance.Save(item);
SessionInstance.Update(item);
我的问题是保存实体。 当我调用保存方法时, OnPreInsert
调用OnPreInsert
方法。 当我调用CommitTransaction() OnPreUpdate
会自动调用OnPreUpdate
。
我还在NHibernate中使用了Concurrency
,导致数据库中Version
属性的值由2
而不是1
引起的自动OnPreUpdate
调用到目前为止,没有问题,但是对于该实体的下一次更新,会发生并发错误,因为该实体中的version值为1
但值为数据库中的版本号为2
。
为什么调用OnPreUpdate
?
我不知道它是否有帮助,但是无论如何,只要您在实体中更新某些内容,也应该在preInsertEvent.State / preUpdateEvent.State中对其进行更新。 有关更多信息, 请参见此帖子http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener希望这会有所帮助
为什么调用OnPreUpdate?
看起来您在“ FlushMode.Auto”或“ FlushMode.Commit”中设置的“ session.FlushMode”可以使用“ FlushMode.Never”,但必须显式调用“ session.Flush()”
你见过用拦截器的机会,它看起来更有力比事件监听
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.