Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate中Auditor事件侦听器实现中的错误调用“OnPreUpdate”_C#_Nhibernate_Nhibernate 3 - Fatal编程技术网

C# NHibernate中Auditor事件侦听器实现中的错误调用“OnPreUpdate”

C# NHibernate中Auditor事件侦听器实现中的错误调用“OnPreUpdate”,c#,nhibernate,nhibernate-3,C#,Nhibernate,Nhibernate 3,我有一个使用NHibernate 3的项目。 我在NHibernate中使用了Auditor事件监听器,用于修剪实体中的字符串属性 我的代码是: public class AuditorEventListener : IPreInsertEventListener, IPreUpdateEventListener { public bool OnPreInsert(PreInsertEvent preInsertEvent) { Correction(preIns

我有一个使用NHibernate 3的项目。 我在NHibernate中使用了
Auditor事件监听器
,用于修剪实体中的字符串属性

我的代码是:

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>
我的问题在于保存实体。 当我调用save方法时,会调用OnPreInsert方法。 当我调用CommitTransaction()时,会自动调用OnPreUpdate

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


为什么要调用“
OnPreUpdate”

我不知道它是否有用,但不管怎样,无论何时更新实体中的内容,都应该在preInsertEvent.State/preUpdateEvent.State中更新它。有关更多信息,请查看此帖子
希望这有帮助

为什么要调用OnPreUpdate

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


您是否看到了使用拦截器的机会,它看起来比EventListener更强大

我的
FlushMode
设置处于
Auto
模式,我需要使用此模式。我无法将其设置为
从不
模式,因为我的项目逻辑不允许我这样做。
SessionInstance.Save(item);
SessionInstance.Update(item);