nhibernate将实体从一种类型转换为另一种类型:如何处理集合?

nhibernate将实体从一种类型转换为另一种类型:如何处理集合?,nhibernate,hql,Nhibernate,Hql,我的情况与中描述的非常相似: 工程师和经理都继承自联系人,工程师可以升级(或降级,取决于您的视角)到经理 区别在于-我记录联系人提交的所有订单。 意思-我的Contact类有一个IList Orders属性,它可以由100000个订单组成。(在您询问之前-显然此属性从未加载到内存中,它只是订单的联系订单提交者属性的另一端) 我喜欢@Jamie Ide建议的那种“复制构造函数”的想法。 问题是-我可以在不将对象加载到内存的情况下更改顺序对象的引用吗 [编辑] 是的,我能用。 然而,这会产生一个不同

我的情况与中描述的非常相似:
工程师
经理
都继承自
联系人
工程师
可以升级(或降级,取决于您的视角)到
经理

区别在于-我记录联系人提交的所有订单。
意思-我的
Contact
类有一个
IList Orders
属性,它可以由100000个订单组成。(在您询问之前-显然此属性从未加载到内存中,它只是
订单
联系订单提交者
属性的另一端)

我喜欢@Jamie Ide建议的那种“复制构造函数”的想法。
问题是-我可以在不将对象加载到内存的情况下更改
顺序
对象的引用吗

[编辑]
是的,我能用。
然而,这会产生一个不同的问题——我试图创建一个实体,并让其他实体在同一事务中引用它。意思是:

Manager manager = new Manager(engineer);
session.Save(manager);
session.CreateQuery("update Order set OrderSubmitter = :manager where OrderSubmitter = :engineer")
  .SetParameter("manager",manager)
  .SetParameter("engineer",engineer)
   .ExecuteUpdate();
session.Transaction.Commit();
但是-ExecuteUpdate立即发生,而
管理器
实体仅在“提交”时保存。
当然,这会导致外键异常。
我可以在调用
Save(manager)
之后立即显式调用
session.Flush()
,来解决这个问题,但这似乎不是很好的做法


有什么想法吗

如您所述,问题在于ExecuteUpdate()会立即发生,并且在插入新管理器后不会发出。我认为立即调用session.Flush()是正确的解决方案。还应删除同一事务中的原始工程师对象


另请参见的答案。

真正的问题是您的建模不正确。 在OO中,对象不会更改其类型。 经理/工程师应建模为一对一关系。 可以将作业类作为Employee的组件属性。 当员工从工程师晋升为经理时,您只需更换组件。此外,您不必更新orders表,因为提交者保持不变。唯一的区别是它的工作部分