【问题标题】:NHibernate duplicate insert in many-to-many and composite-elementNHibernate 在多对多和复合元素中重复插入
【发布时间】:2013-10-14 06:51:10
【问题描述】:

我在 NHibernate 2 应用程序中有一个 Product 实体,它与位置具有多对多关系。 Location 实体没有任何导航属性或返回产品的映射。它的映射如下:

<bag name="Locations" table="ProductLocation" cascade="none">
  <key column="ProductId" />
  <many-to-many column="LocationId" class="Location"/>
</bag>

该产品还有一个复合元素,一个具有通过 ProductComponent 类映射的浓度的组件。该类没有导航属性或映射回产品。

<bag name="ProductComponents" table="ProductComponent" access="nosetter.camelcase">
  <key column="ProductId" />
  <composite-element class="ProductComponent">
    <property name="Concentration"/>
    <many-to-one name="Component" column="ComponentId" access="nosetter.camelcase"/>
  </composite-element>
</bag>

当一次只插入一个产品时,这一切都很好。但是,当批量插入多个产品时它会失败。

虽然产品本身可以很好地插入,但每个产品都有自己的唯一 ID,多对多 (Locations) 和复合元素 (ProductComponent) 中的元素不能很好地插入。这是因为 NHibernate 多次执行对具有相同 ProductId 的 ProductLocation 表的插入。

这会导致链接表中出现重复记录。如何预防?

【问题讨论】:

    标签: tsql nhibernate


    【解决方案1】:

    您必须将关系的一个站点定义为所有者,以便只有一侧进行插入。这可以通过将另一侧的 Inverse 设置为 true 来实现。

    Find a more detailed explanation here

    【讨论】:

    • 当 Location 没有 Product 的导航属性时,这是否也适用?如果是这样,我如何声明产品为关系的所有者?
    • 据我了解是的,因为您将拥有该对象的 2 个所有者。要让包持有人成为所有者,您可以将 Inverse 设置为 false。这会将这一方设置为所有者。但只需稍微玩一下,并仔细阅读链接的示例
    猜你喜欢
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2021-04-07
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2014-05-04
    相关资源
    最近更新 更多