2012-06-17 57 views
1

我的域對象有一個「CreateDate」和「ModidfyDate」成員(DateTime)。nHibernate3 + FluentNHibernate - 「CreateDate」成員不可用更新

當用戶更新域對象(Asp.Net MVC)時,我的視圖模型不包含這些值。 (這是在我的存儲庫「創建」和「更新」方法)

因此,當我更新一個對象,我沒有「CreateDate」可用,因此更新方法將失敗。 我似乎有2個選項,我不喜歡: 1)沿着「CreateDate」屬性(窗體中的隱藏字段)有我的viewmodel標籤,所以我有原始的CreateDate可用。 2)或者,在我的「更新」存儲庫方法中,首先從數據庫中獲取原始記錄,並設置要更新的CreateDate成員的對象(不必要的調用db)

什麼是「normal 「與此合作的方式?

回答

1

處理CreateDateModifyDate的好方法是使用NHibernate的事件偵聽器。

下面是關於如何使用IPreInsertEventListenerIPreUpdateEventListener創建簡單的審計一些樣品:

http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener
http://nhforge.org/wikis/howtonh/creating-an-audit-log-using-nhibernate-events.aspx


在一個側面說明,你不應該對你的UpdateCreateDate問題方法。你的Update方法是怎樣的?

通常的工作流程是在POST ActionMethod中獲取視圖模型,使用NHibernate的ISession或您的自定義存儲庫從數據庫加載實體對象,然後通過手工將視圖模型中的屬性映射到實體,或者使用像AutoMapper這樣的工具。在視圖模型到實體的映射中應該忽略CreateDate等屬性。

+1

巧合的是,隨着你提醒人們如何通常這樣做(在操作方法中「重新加載」實體,然後更新它的成員。現在手動操作,但即將用AutoMapper來實現) – Krokonoster

+0

我剛開始查看第一次)到IInterceptor。你知道這與這個IPreInsert/Update Event監聽器相比如何? – Krokonoster

+0

下面是一個關於攔截器和事件監聽器之間區別的SO問題:http://stackoverflow.com/questions/867341/nhibernate-difference-interceptor-and-listener –