将基类对象设置为派生类对象

时间:2013-08-23 11:41:16

标签: c# nhibernate

我有四节课。 Person,NaturalPerson(继承自Person),GroupFamilyMember(继承自NaturalPerson),QuotationHolder(继承自GroupFamilyMember)。

他们都拥有相同的ID。

我的问题如下:

有一种方法可以根据文档编号返回现有的NaturalPerson(存储在DB中)对象。然后,我必须创建一个QuotationHolder,我希望QuotationHolder对象包含检索到的NaturalPerson对象。

问题是,我不能像这样抛出这个对象(我知道原因):

QuotationHolder quotationHolder = (QuotationHolder) naturalPerson;

我尝试使用反射创建一个新的QuotationHolder对象并使用naturalPerson的对象值设置其值。

但是当我丢失对检索到的对象的引用时,当我想以级联方式保存时,NHibernate给了我以下异常:

  

具有相同标识符值的其他对象已与会话

关联

我猜它试图将对象保存为新对象。

考虑一下:

使用HILO算法设置ID。 不能改变映射。

1 个答案:

答案 0 :(得分: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。