繁体   English   中英

NHibernate中Auditor事件侦听器实现中调用OnPreUpdate的错误放置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM