2009-11-10 39 views
0

我已經閱讀NHibernate - Changing sub-types,但我不覺得我的情況令人滿意。在NHibernate中更改子類型

我的系統允許用戶安排工作。可以使用不同類型的時間表標準(僅限一次,每日,每週,每月每月以及每月每月)設置時間表。其中每一個都有非常不同的數據和行爲。對於用戶來說,將時間表從一種標準類型更改爲另一種標準類型是完全有效的。

我試圖通過抓取先前保存的計劃ID來創建此工作,使用新類型創建計劃的新實例,設置ID並保存。所有數據都按預期更新,當然除了鑑別器。

更改我的模型將是絕對的最後手段。

在這一點上,我正在尋找保存新標準(使用新ID)並更新對其的引用,然後刪除舊標準。

有人有更好的主意嗎?

回答

0

您是否嘗試過對矯正你的disciminator映射添加力=真像下面的hbm.xml元素

<discriminator column="DiscriminatorColumnName" force="true" />

+0

嗯......我想嘗試一下,但是在Fluent-NHibernate的鑑別器映射時遇到了問題 – Will 2009-11-11 02:23:27

0

既然你已經彎曲對象身份的NHibernate的觀點,你爲什麼不只需使用一些自定義SQL在NHib之外更新它?

我的首選解決方案是更新我的模型,但您已經說過這是您的最後一招。

+0

出於好奇,你會如何建議更新模型? – Will 2009-11-20 01:59:43

+0

選擇1:創建正確類型的新時間表對象,並將作業鍵入新時間表(即將獲得新的PK值)。 選擇2:創建一個「超級時間表」的對象,可以在任何或所有的每日,每週,每月等等上觸發。 IOW沒有DailySchedule類或WeeklySchedule類。改變一個時間表就變成了更新這個對象相關位的問題,而不是試圖改變對象的類型。 – 2009-11-25 22:24:37

0

如果你想使用NHibernate的,那麼你就必須做出讓步是:

編寫面向對象的代碼。

如果你的具體情況很難以面向對象的方式表達,那麼你不應該在這種情況下使用NHibernate。

對於你的情況,你應該:

  • 創建一個類派生Schedule的新實例,並允許它有一個新的ID
  • 從舊Schedule實例複製相關屬性
  • Session刪除舊的Schedule實例,並確保Job實例沒有引用它
  • 添加新的Schedule實例的Session,並確保有關引用Job例如,它

這將結束,在數據庫級別,作爲deleteinsert,而不是一個update

這不是最後的手段。這應該是你的第一個度假村。從面向對象的角度來看,這是正確的做法。

+0

本質上講,這是我在做什麼: *創建新ScheduleCriteria從UI 填充它*識別舊ScheduleCriteria 的id *保存日程安排與它的新ScheduleCriteria *通過ID – Will 2009-11-20 01:58:07

+0

刪除舊ScheduleCriteria由方式,是什麼讓你覺得這不是面向對象的?我能夠對現有模型使用此方法,而無需進行任何更改。 練習的要點是嘗試通過執行更新而不是刪除+插入來更持久地保留對象。這裏有什麼相關的是我的對象和關係模型之間的映射;因此,ORM。 – Will 2009-11-20 02:00:14

+0

有了NHibernate,你不會堅持你的對象。使用NHibernate,你可以編寫面向對象的代碼,並且相當神奇地信任NHibernate來保持你的對象。這意味着你應該在C#語言的語義範圍內工作。在C#中,您不能更改對象的類型。當使用NHibernate時,你不應該嘗試改變一個對象的類型。 – yfeldblum 2009-11-20 13:50:01