在NHibernate中的Auditor事件监听器实现中错误地调用了“OnPreUpdate”

时间:2012-08-25 06:25:15

标签: c# nhibernate nhibernate-3

我有一个使用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

2 个答案:

答案 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

更有力