我有四节课。 Person,NaturalPerson(继承自Person),GroupFamilyMember(继承自NaturalPerson),QuotationHolder(继承自GroupFamilyMember)。
他们都拥有相同的ID。
我的问题如下:
有一种方法可以根据文档编号返回现有的NaturalPerson(存储在DB中)对象。然后,我必须创建一个QuotationHolder,我希望QuotationHolder对象包含检索到的NaturalPerson对象。
问题是,我不能像这样抛出这个对象(我知道原因):
QuotationHolder quotationHolder = (QuotationHolder) naturalPerson;
我尝试使用反射创建一个新的QuotationHolder对象并使用naturalPerson的对象值设置其值。
但是当我丢失对检索到的对象的引用时,当我想以级联方式保存时,NHibernate给了我以下异常:
具有相同标识符值的其他对象已与会话
关联
我猜它试图将对象保存为新对象。
考虑一下:
使用HILO算法设置ID。 不能改变映射。
答案 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。