1

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

他们都共享相同的 ID。

我的问题是以下一个:

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

问题是我不能像这样投射对象(我知道原因):

QuotationHolder quotationHolder = (QuotationHolder) naturalPerson;

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

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

具有相同标识符值的不同对象已与会话关联

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

只需考虑:

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

4

1 回答 1

0

我理解你的问题的方式,这就是你想要做的:

class A {}
class SubA : A {}

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

在 C# 中无法更改现有对象的类(类型)。NHibernate 旨在在对象模型和关系存储模型之间进行转换,因此也不支持此功能。

当需要将对象视为更改类时,还有其他可能的模型可以处理,例如状态设计模式。或者,也许您应该重新考虑这是否真的是您想要的——也许子类所拥有的附加数据应该在“兄弟对象”中,即对基本人员类的引用。

也可以使用纯 SQL 将表示 NaturalPerson 的数据转换为表示 QuotationHolder 的数据 - 当要求加载转换后的数据时,NHibernate 现在将实例化 QuotationHolder。

于 2013-08-24T14:16:23.557 回答