繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM