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表,因为提交者保持不变。唯一的区别是它的工作部分