NHibernate映射表中的其他列的多对多映射

时间:2009-06-14 14:20:31

标签: sql-server nhibernate nhibernate-mapping many-to-many

有两个表Person和Address。我有一个映射表PersonAddressMap,它包含一个额外的列IsCurrent而不是两个外键(没有显式的主键列)。我为Person,Address和PersonAddressMap创建了三个映射类。我需要访问一个Person的所有地址,并访问所有具有Address地址的人员,所以我在Person和Address类中都有一对多的PersonAddressMap。现在的问题是双向关联正在创造一个infiniteloop。如果我删除其中一个关联,加载工作正常,但Save没有插入到映射表中(例如:如果我只有一个从Person到PersonAddressMap的关联并尝试插入一个具有新地址的新Person,那么只有Person是插入。)映射文件看起来像这样,

  <class name="Person" table="Person">

    <id name="Id">  
      <column name="Id" sql-type="int" not-null="true" />
      <generator class="identity" />
    </id>
    <property name="Name" column="Name"/>
    <bag name="AddressDetails" table="PersonAddressMap" cascade="all" >
      <key column="PersonId" />
      <one-to-many class="PersonAddressMap" />
    </bag>
  </class>

  <class name="Address" table="Address">

    <id name="Id">  
      <column name="Id" sql-type="int" not-null="true" />
      <generator class="identity" />
    </id>
    <property name="City" column="City"/>
    <bag name="PersonDetails" table="PersonAddressMap" cascade="all" >
      <key column="AddressId" />
      <one-to-many class="PersonAddressMap" />
    </bag>
  </class>

  <class name="Job" table="Job" lazy="false">
    <composite-id>
      <key-many-to-one column="PersonId" name="Person" />
      <key-many-to-one column="AddressId" name="Address" />
    </composite-id>
    <property name="IsCurrent" column="IsCurrent"/>
  </class>

提前致谢。

2 个答案:

答案 0 :(得分:0)

多对多关系始终要求您使用inverse标记关系的一个端点。在您的特定示例中,您可以使用Person的AddressDetails。 e.g。

<bag name="AddressDetails" table="PersonAddressMap" cascade="all" inverse="true">
  <key column="PersonId" />
  <one-to-many class="PersonAddressMap" />
</bag>

答案 1 :(得分:0)

当我使用inverse ='true'时,不会插入连接表值(即PersonAddressMap)。

如果我设置inverse ='false',它们会被插入,但我也看到sql中出现删除语句