2010-07-12 65 views
0

我重寫了NHibernate的PreInsertEventListener,以便將實體的DateCreated屬性設置爲DateTime.Now。無法在NHibernate事件偵聽器中設置實體屬性

這裏是我的代碼:

public bool OnPreInsert(PreInsertEvent e) 
{ 
    DomainObject domainObject = (DomainObject) e.Entity; 
    if (domainObject.CreatedById == 0) throw new Exception("The " + domainObject.GetType().Name + " cannot be created if its CreatedById property has not been set."); 
    domainObject.DateCreated = DateTime.Now; 
    return false; 
} 

我發現,這裏設置的任何實體屬性(例如,呼叫上面dateCreated會)沒有找到自己的方式進入由NHibernate的創建的SQL更新。有誰知道什麼給了?

是的,我確信我的事件監聽器正在被調用!

感謝

大衛

回答

1

嗯,看來你在這個階段的比賽中使用特定的語法來修改實體的屬性。

即語法如下所示:

Why both NHibernate OnPreInsert and OnPreUpdate methods get called for an object

請注意,我發現你不也得設置實體的屬性以正常的方式爲好,它這個代碼。

感謝

大衛

+0

正確的,一些額外的增強我可以建議在這裏: 1)使用從實體(例如dateCreated會和DateCreatedPropertyName) 公開屬性和屬性名的接口。 2)爲包含SetProperty邏輯的攔截器使用基類(或使用助手類保持此用法一致) – DanP 2010-07-12 13:52:22

+0

感謝您的建議。我可以只問第一個理由嗎? – David 2010-07-12 14:05:19

+0

@David:這允許你爲可能需要它的多個實體使用攔截器,除非你確定所有的實體將使用與接口公開的完全相同的屬性名稱,否則屬性名通常是一個好主意(因爲你需要它是'set'調用的字符串版本) - 有意義嗎? – DanP 2010-07-12 14:08:06