[英]Setting base class object to derived class object
我有四节课。 Person,NaturalPerson(继承自Person),GroupFamilyMember(继承自NaturalPerson),QuotationHolder(继承自GroupFamilyMember)。
它们都共享相同的ID。
我的问题是以下一个:
有一种方法可以根据文档编号返回现有的NaturalPerson(存储在DB中)对象。 然后,我必须创建一个QuotationHolder,并且我希望那个QuotationHolder对象包含检索到的NaturalPerson对象。
问题是,我无法像这样投射对象(我知道原因):
QuotationHolder quotationHolder = (QuotationHolder) naturalPerson;
我尝试创建一个新的QuotationHolder对象,并使用反射使用naturalPerson的对象值设置其值。
但是当我丢失对检索到的对象的引用时,当我想以级联方式保存时,NHibernate给了我以下异常:
具有相同标识符值的另一个对象已与该会话相关联
我猜想它试图将对象另存为新对象。
只是考虑:
使用HILO算法设置ID。 映射既不能更改类别,也不能更改。
根据您对问题的理解,这就是您要尝试做的事情:
class A {}
class SubA : A {}
A instance = new A();
instance = magic-convert-object-to-different-type<Sub>(instance);
更改现有对象的类(类型)不能在C#中完成。 NHibernate旨在在对象模型和关系存储模型之间进行转换,因此也不支持这一点。
当需要将对象视为变化的类时,还有其他可能的模型可以处理,例如State设计模式 。 或者,也许您应该重新考虑这是否真的是您真正想要的-子类拥有的其他数据应该在“兄弟对象”中,该引用返回到基本人员类。
也可以使用普通SQL将代表NaturalPerson的数据转换成代表QuotationHolder的数据-当要求加载转换后的数据时,NHibernate现在将实例化QuotationHolder。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.