Tsql NHibernate多对多和复合元素中的重复插入

Tsql NHibernate多对多和复合元素中的重复插入,tsql,nhibernate,Tsql,Nhibernate,我在NHibernate 2应用程序中有一个产品实体,它与一个位置有多对多关系。位置实体没有任何导航属性或回产品的映射。它是这样映射的: <bag name="Locations" table="ProductLocation" cascade="none"> <key column="ProductId" /> <many-to-many column="LocationId" class="Location"/> </bag> 该

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

<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,多对多(位置)和复合元素(ProductComponent)中的元素插入得不好。这是因为NHibernate多次使用相同的ProductId执行对ProductLocation表的插入


这会导致链接表中出现重复记录。如何防止这种情况发生?

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


当位置没有产品导航属性时,这是否适用?如果是,我如何声明产品是关系的所有者?据我所知,是的,因为您将有两个对象的所有者。要使行李持有者成为所有者,可以将“反向”设置为false。这将使这一方成为所有者。但只需简单地玩一点,并仔细阅读链接的示例