2012-01-15 48 views
2

繼我上一個問題How to implement LastUpdate in NHibernate Entities?如何爲更新和保存配置NHIbernate事件偵聽器?

我有我的審計表兩列在我的數據庫:

  1. created datetime default getdate() not null(該行的創建日期)

  2. lastUpdate datetime null(日期時間此行的最後更新)

我想創建一個監聽器更新只有在NHibernate,因爲d數據庫引擎會使用默認約束來處理新記錄。我試圖創建一個自定義監聽器使用此代碼:

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事件或PreUpdatePostUpdate

我想知道如果我應該使用PreUpdate事件,使我的聽衆從DefaultUpdateEventListener繼承,但那麼我不確定我需要重寫哪個方法。沒有Update方法可以覆蓋。

+0

被覆蓋的PerformUpdate事件我知道這是一個老的文章,但你有沒有遇到過這篇博文? http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener – Rippo 2012-12-02 08:23:31

回答

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'方法?或者我的基礎實體類?配置代碼在哪裏去? – 2012-01-16 08:50:40

+0

你可以在你的CustomEventUpdateListener類中實現它。 上面的代碼使用此事件偵聽器連接會話工廠。然後,您從該工廠創建NHibernate會話,並且將針對即將更新的每個實體(通過會話上的Flush)調用偵聽器的OnPreUpdate方法。 – Wiz101 2012-01-16 20:19:01

1

看來,有是可以從DefaultSaveOrUpdateEventListener

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