简体   繁体   English

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

[英]Misplaced call `OnPreUpdate` in Auditor Event listener implementation in NHibernate

I have a project by using NHibernate 3. I used Auditor Event Listener in NHibernate for Trim of string properties in my entities. 我有一个使用NHibernate 3的项目。我在NHibernate中使用了Auditor Event Listener来修剪实体中的字符串属性。

My code is : 我的代码是:

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 config is : 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>

I used below commands for save and update for entities: 我使用以下命令保存和更新实体:

SessionInstance.Save(item);
SessionInstance.Update(item);

My problem is in save entity. 我的问题是保存实体。 When I call save method, OnPreInsert method is called. 当我调用保存方法时, OnPreInsert调用OnPreInsert方法。 When I call CommitTransaction() OnPreUpdate is called Automatically. 当我调用CommitTransaction() OnPreUpdate会自动调用OnPreUpdate

Also I used Concurrency in NHibernate and this Automatically OnPreUpdate call caused to value of Version property in database be 2 instead of 1 So far no problem but for next update of this entity concurrency error would happen because value of version in this entity is 1 but value of version in database is 2 . 我还在NHibernate中使用了Concurrency ,导致数据库中Version属性的值由2而不是1引起的自动OnPreUpdate调用到目前为止,没有问题,但是对于该实体的下一次更新,会发生并发错误,因为该实体中的version值为1但值为数据库中的版本号为2

Why is OnPreUpdate called? 为什么调用OnPreUpdate

I don't know if it helps but anyway whenever you update something in entity you also should update it in preInsertEvent.State/preUpdateEvent.State. 我不知道它是否有帮助,但是无论如何,只要您在实体中更新某些内容,也应该在preInsertEvent.State / preUpdateEvent.State中对其进行更新。 For more information look at this post http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener Hope this helps 有关更多信息, 请参见此帖子http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener希望这会有所帮助

Why is OnPreUpdate called? 为什么调用OnPreUpdate?

It looks like your "session.FlushMode" set in "FlushMode.Auto" or "FlushMode.Commit" You can use "FlushMode.Never" but you have to explicitly call "session.Flush()" 看起来您在“ FlushMode.Auto”或“ FlushMode.Commit”中设置的“ session.FlushMode”可以使用“ FlushMode.Never”,但必须显式调用“ session.Flush()”

Have you seen an opportunity to use interceptor, it looks more powerfully than EventListener 你见过用拦截器的机会,它看起来更有力比事件监听

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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