2012-01-15 9 views
2

私の以前の質問How to implement LastUpdate in NHibernate Entities?からのフォロー。更新と保存のNHIbernateイベントリスナーを設定するには?

は、私は私のデータベースに私の監査済みのテーブル上に2つの列があります。

  1. created datetime default getdate() not null(この行の作成日)

  2. lastUpdate datetime null(この行が最後に更新された日時)

NHibernate内で更新のみのリスナーを作成する場合は、をd atabaseエンジンはデフォルトの制約で新しいレコードを処理します。私はこのコードを使用したカスタムリスナーを作成しようとしました:

public class CustomUpdateEventListener : DefaultSaveOrUpdateEventListener 
{ 
    protected override object PerformSaveOrUpdate(SaveOrUpdateEvent evt) 
    { 
     var entity = evt.Entity as IAuditableEntity; 
     if (entity != null) 
     { 
      ProcessEntityBeforeUpdate(entity); 
     } 
     return base.PerformSaveOrUpdate(evt); 
    } 

    internal virtual void ProcessEntityBeforeUpdate(IAuditableEntity entity) 
    { 
     entity.UpdateDate = DateTime.Now; 
    } 
} 

、それは更新のための素晴らしい作品が、それはまたSaveイベント(私は、データベースに新しい行を追加します)のために実行されます。私はそれが新しい列のために発射させたくありません。私はUpdateのイベントだけを聞くためにコードを変更しようとしましたが、私はそれを解決できません。

は私が DefaultUpdateEventListenerから継承するクラスを変更しようとしましたが、何の UpdateEvent(のみ SaveOrUpdateイベントや PreUpdateまたは PostUpdate)ありません

私はPreUpdateイベントを使用する必要がある場合は疑問に思って、私のリスナーがDefaultUpdateEventListenerから継承作ってるんだけどどのメソッドをオーバーライドする必要があるのか​​よく分かりません。上書きする方法はありません。Update

+0

から無効にすることができPerformUpdateのイベントがあることが表示されますあなたはこのブログ記事を見に来ましたか? http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener – Rippo

答えて

2

クラスにIPreUpdateEventListenerインターフェイス(およびそのOnPreUpdateメソッド)を実装させることができます。次に、設定によってセッション・イベント・listernersにクラスを追加します。

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration(); 
cfg.EventListeners.PreUpdateEventListeners = 
    new IPreUpdateEventListener[] {new YourEventListener()}; 
sessionFactory = cfg.BuildSessionFactory(); 
+0

これを実装するクラスはどれですか? DALの私の 'Update'メソッド?または私のベースエンティティクラスですか?その設定コードはどこに行きますか? –

+0

これをCustomEventUpdateListenerクラスに実装できます。 上記のコードは、このイベントリスナーとセッションファクトリを結び付けています。次に、このファクトリからNHibernateセッションを作成し、リスナのOnPreUpdateメソッドが(セッション上のFlushを介して)更新される各エンティティに対して呼び出されます。 – Wiz101

1

私は、これは古い記事です知っているが、DefaultSaveOrUpdateEventListenerクラス

protected override void PerformUpdate(NHibernate.Event.SaveOrUpdateEvent @event, object entity, NHibernate.Persister.Entity.IEntityPersister persister) 
{ 
    base.PerformUpdate(@event, entity, persister); 
} 
関連する問題