首页 > 解决方案 > 在 nHibernate 中更新子值

问题描述

我有数据库结构invoiceinvoiceParentswith one-to-manyinverseequals"false"cascadeequals "all-delete-orphan"。下面是父母和孩子的一些片段.hbm

家长:

<id name="InvoiceId" column="INVOICEKEYID" unsaved-value="0">
   <generator class="sequence">
   <param name="sequence">SOME_SEQ</param>
   </generator>
</id>
...
<bag name="Partners" table="PARTNER" cascade="all-delete-orphan" inverse="false" lazy="true">
      <key column="INVOICEKEYID"/>
      <one-to-many class="Partner"/>
</bag>

孩子们:

<id name="Id" column="PARTNERKEYID" unsaved-value="0">
  <generator class="sequence">
     <param name="sequence">ANOTHER_SEQ</param>   
  </generator> 
</id>
...
<many-to-one name="Invoice" column="INVOICEKEYID" class="Invoice" />

当我第一次创建saveOrUpdate(invoice)时,对于 invoice 和 invoicePartners 有 INSERT 语句,fk 为空,之后是 UPDATE 语句,invoicePartners 有正确的 fk。直到此时一切正常。当我想更新时,只有 INSERT 用于 invoicePartners,一个 UPDATE 用于发票。invoicePartners 没有更新或删除和插入。我在 vs 输出中观看它。nHibernate 是如何工作的?首先我应该删除合作伙伴,然后插入新的合作伙伴,否则 nHibernate 会自动更新它?

标签: c#nhibernate

解决方案


这一切都源于您创建的拥有bag( )。inverse="false"作为一般规则,永远不要创建拥有包,bagwith ( inverse="true") 提供最终性能,因为操作不会失败。

在这种情况下,我会小心不要最终导致 PK 违规,NHibernate 不会处理您插入 PK 违规的情况invoicePartner,因为您已经告诉它它是 abag而不是 a set。如果您没有 PK 并且想要重复invoicePartner的 s,则继续使用bag,如果没有,请切换到set。显然,如果您class在内部确保这一点,那么您将避免这个问题。

不过一般要小心bag,我认为在这种情况下你很好,因为可以识别映射的实体,所以你应该得到与 a 类似的性能set。但是如果它们不能被识别,那么 NHibernate 将不得不删除所有的子节点并在任何集合更改时重新插入它们!


在将 an 添加invoicePartner到 an 时invoice

invoicePartner不会保存关系,因为您已经告诉映射您希望拥有invoice它。

因此,在对数据库进行任何插入或更新时,invoicePartner都无法填写该INVOICEKEYID列。

因此,正如您所观察到的,父invoice级等到invoicePartner数据库中存在,然后更新外键列。

根据默认行为,此更新可能完全是浪费时间,因为在我看来,孩子已经自己保存了这个外键!


在更新invoicePartner集合时:

你说的真的不合适。invoice如果您所做的只是更改invoiceParnter集合,NHibernate 将不会调用更新。桌子上没有什么要更新的invoice


cascade="all-delete-orphan"确保父级保持集合与自身同步,invoicePartner只要您在更改集合后保存或更新父级,它就会相应地插入、更新和删除表中的行!

但是您应该inverse="true"在父级上设置bag并添加inverse="false"invoicePartner many-to-one地图中。完成此操作后,检查我在第 3 段中提到的情况,即 NHibernate 无法识别实体,并确保它确实invoicePartners通过它们的标识符关联并有效地进行更改。


参考: http: //nhibernate.info/doc/nhibernate-reference/example-parentchild.html


推荐阅读