2010-06-24 48 views
0

我有一種情況,其中數據庫中的某一列是使用觸發器生成的,因爲我們生成了一個無法更改的值。如果我在我的NHibernate映射中將屬性設置爲generated = insert,它就像一個魅力一樣,NHibernate會在沒有生成屬性的情況下插入行,然後執行select從數據庫中提取值。在NHibernate中控制屬性的生成設置

但我也有我希望能夠顯式設置屬性的情況(如果未設置該觸發器,則只設置列)。但我無法讓NHibernate允許我這樣做。當它被設置爲generated = insert時,它將始終忽略我在對象中設置的屬性。所以我真的想要以某種方式告訴NHibernate,當屬性爲「未觸及」/ null時,作爲屬性生成,但如果設置,則不要。

是否有可能以某種方式配置NHibernate這種方式?

回答

0

我的域模型允許空值插入。而且我的觸發器只會在插入空值時設置列。我想要實現的是在運行時決定,不管NHibernate應該如何處理它作爲一個生成的屬性。

但是從我所能理解的情況來看,NHibernate沒有這種靈活性,並且在它構建會話工廠一次用於多種用途的配置結構方面有所進展。

另一種解決方案可能是建立兩個會話工廠,每個場景都有一個工廠。 第一個(產生屬性的地方)是正常使用。 第二個(其中屬性是未生成的)是在上傳場景中,我需要維護代碼中的屬性值。 我使用FluentNHibernate進行映射,並且由於它反映了我的映射類,所以我可以在創建會話工廠時設置一個狀態,因此當我讀取映射時,可以根據哪個會話執行if/else語句工廠目前正在建造中。這應該允許我在沒有重複配置的情況下實現這兩種配置,儘管兩個會話工廠正在運行而不是一個。

我還沒有嘗試過它,只有理論,但它應該解決我的問題,並希望其他人試圖實現類似。

+0

順便說一句......如果你編輯了原始問題並添加了這些信息而不是添加它作爲答案(除非它實際上是一個你正在做的答案)。 – R0MANARMY 2010-06-29 15:15:02

0

文檔爲generated屬性狀態(重點煤礦):

屬性標記爲產生必須另外是非插入和不可更新。只有第5.1.7節「版本(可選)」,第5.1.8節,「時間戳(可選)」和第5.1.9節「屬性」可以標記爲已生成。

它是一個可以在您的域模型中設置爲空的屬性,所以在初始插入沒有任何東西進入它,你的觸發器仍然認爲它是未觸及的?

1

我不認爲你可以通過配置來實現這一點。但是,插入後可以簡單地調用ISession.Refresh(myObject)以強制它返回到數據庫並刷新對象。