我有一个使用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);
我的问题在于保存实体。
当我调用save方法时,调用OnPreInsert
方法。
当我调用CommitTransaction()时,OnPreUpdate
被称为自动调用。
此外,我在NHibernate中使用了Concurrency
,并且此自动OnPreUpdate
调用导致数据库中Version
属性的值为2
,而不是1
到目前为止没问题
但是对于此实体的下一次更新,会发生并发错误,因为此实体中的版本值为1
,但数据库中的版本值为2
。
为什么要调用OnPreUpdate
?
答案 0 :(得分:0)
我不知道它是否有帮助,但无论如何,只要你在实体中更新某些东西,你也应该在preInsertEvent.State / preUpdateEvent.State中更新它。有关详细信息,请查看此帖http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener 希望这有帮助
答案 1 :(得分:0)
为什么要调用OnPreUpdate?
看起来你的“session.FlushMode”设置在“FlushMode.Auto”或“FlushMode.Commit”中 你可以使用“FlushMode.Never”但你必须明确地调用“session.Flush()”
您是否有机会使用拦截器,它看起来比EventListener
更有力