2013-08-23 171 views
1

我有四個類。 Person,NaturalPerson(繼承自Person),GroupFamilyMember(繼承自NaturalPerson),QuotationHolder(繼承自GroupFamilyMember)。將基類對象設置爲派生類對象

它們都共享相同的ID。

我的問題是下列之一:

有,它返回一個現有NaturalPerson(存儲在DB)對象基於文檔數目的方法。然後,我必須創建一個QuotationHolder,並且我希望QuotationHolder對象包含檢索的NaturalPerson對象。

問題是,我不能投這樣的對象(我知道的原因):

QuotationHolder quotationHolder = (QuotationHolder) naturalPerson; 

我試圖創建一個新的QuotationHolder對象,並與naturalPerson's設置它的值對象值使用反射。

但正如我失去了參考檢索的對象,當我想在級聯保存,NHibernate的讓我有以下異常:

用同樣的標識值不同的對象已經與會議有關的

我想它試圖將對象保存爲一個新對象。

只是考慮:

ID使用HILO算法設置。 映射不能改變,既不是類。

+0

我想你應該嘗試的第一件事是你的NHSession.Evict(naturalPerson);在保存報價之前請保留 – jbl

+0

有人告訴我我也可以使用合併命令。但我無法訪問會話。我已經提供了一個只允許Save()和Delete()的接口。我想要的是不要失去對naturalPerson對象的引用並將其分配給quotationHolder之一。但我想這根本不可能。 – Andres

回答

0

我明白你的問題的方式,這就是你正在嘗試做的:

class A {} 
class SubA : A {} 

A instance = new A(); 
instance = magic-convert-object-to-different-type<Sub>(instance); 

更改現有對象的類(類型)不能在C#來完成。 NHibernate被設計用於在對象模型和關係存儲模型之間進行轉換,因此也不支持這一點。

還有其他可能的模型可以處理何時需要將對象視爲不斷變化的類,例如State design pattern。或者,也許你應該重新考慮這是否真的是你想要的 - 也許這些子類所持有的額外數據應該在「兄弟對象」中,這些數據可以回溯到基本人類。

也可以使用普通SQL將表示NaturalPerson的數據轉換爲表示QuotationHolder的數據 - 當要求加載轉換後的數據時,NHibernate現在將實例化QuotationHolder。

相關問題