0

我有一个使用 NHibernate 3 的项目。我Auditor Event Listener在 NHibernate 中用于修剪我的实体中的字符串属性。

我的代码是:

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 方法被调用。当我调用 CommitTransaction() 时OnPreUpdate会自动调用。

另外我Concurrency在 NHibernate 中使用了这个自动OnPreUpdate调用导致Version数据库中的属性值2不是1 到目前为止没有问题但是对于这个实体的下一次更新会发生并发错误,因为这个实体中1的版本值是但数据库中的版本值是2

为什么OnPreUpdate叫?

4

2 回答 2

0

为什么要调用 OnPreUpdate?

它看起来像您在“FlushMode.Auto”或“FlushMode.Commit”中设置的“session.FlushMode”您可以使用“FlushMode.Never”但您必须显式调用“session.Flush()”

你见过使用拦截器的机会吗,它看起来比 EventListener 更强大

于 2012-08-25T21:12:55.517 回答
0

我不知道它是否有帮助,但无论如何,每当您更新实体中的某些内容时,您也应该在 preInsertEvent.State/preUpdateEvent.State 中更新它。有关更多信息,请查看这篇文章http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener 希望这会有所帮助

于 2012-08-25T10:37:47.237 回答