nhibernate具有关系特定属性的多对多

时间:2009-12-04 18:05:00

标签: nhibernate many-to-many

有没有办法在特定于关系的列表中的每个项目上映射多对多关系?我试图解决的实际案例是:

企业可以与许多联系人相关联,联系人可以与许多企业相关联。我想要做的是提供关系的状态,例如活动或已删除以及联系人被邀请(或添加)成为该企业的联系人的日期。所以说一个联系人可以为一个企业活跃,但等待另一个企业。

我知道我可以通过简单地将关系设置为实际实体并将关联实体映射到集合来轻松实现此目的,但我真的很讨厌这样做。只是感觉很脏,使得某种关系成为一个真正的实体。我想知道的是,是否有办法将关系特定属性映射到每个对象。所以,说我有一个企业的联系人列表。该列表中的每个联系人都有一个状态,但在映射中,它将使该状态特定于业务。我希望我可以在商业映射中做这样的事情:

<bag name="Contacts" table="BusinessContactAssociations" lazy="true" cascade="all">
  <key column="BusinessID"/>
  <many-to-many class="Contact" column="ContactID">
    <join table="BusinessContactAssociations">
      <key column="ContactID"/>
      <property name="InvitedDate"/>
      <property name="Status"/>
    </join>
  </many-to-many>
</bag>

但当然这不起作用,因为连接不能在多对多中使用,但它说明了我想要的内容。

任何人都有任何方便的nhibernate映射魔法吗?

2 个答案:

答案 0 :(得分:1)

据我所知,多对多只用于使用典型的两列连接表。鉴于你想要为关系添加属性,你最好将它映射为与连接类的两个独立的一对多关系(好吧,因为它有自己的属性,但你知道我的意思)。

<强>更新

这不是nHibernate魔术,但没有什么可以阻止你使用私有或隐藏的连接类,然后从主类中公开连接类的属性。

答案 1 :(得分:0)

您可以使用<map>来获取三元关联,而不是<many-to-many>映射。然后,如果希望多个属性与关系关联,则可以使用<composite-index>来获取用作字典键的值对象。查看Ayende's blog post以获取一些示例代码。