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);

私の問題はエンティティの保存にあります。save メソッドを呼び出すと、OnPreInsert メソッドが呼び出されます。CommitTransaction() を呼び出すOnPreUpdateと、自動的に呼び出されます。

また、私Concurrencyは NHibernate で使用し、これを自動的OnPreUpdateに呼び出しVersionてデータベース内のプロパティの値にする2代わりに、これまでのところ問題はありませんが、このエンティティのバージョンの値がデータベースのバージョンの値1 であるため、このエンティティの次の更新で同時実行エラーが発生します。12

なぜ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 に答える