2009-12-04 96 views
1

有没有一种方法可以映射与关系中特定于列表中每个项目上的属性的多对多关系?我试图解决的实际案例是:nhibernate多对多关系特定属性

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

我知道我只需将关系作为实际的实体并将关联实体映射到集合即可轻松实现此目的,但我真的很讨厌这样做。它只是感觉肮脏,就像一个关系是一个实际的实体。我想知道的是,是否有办法将关系特定的属性映射到每个对象。所以,说我有一个企业的联系人列表。该列表中的每个联系人都有一个状态,但在映射中它会使该状态特定于该业务。我希望我可以做这样的事情,这将是业务映射:

<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映射魔术?

回答

1

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

更新

这不是NHibernate的魔术,而是有什么可使用连接类,它是私人或以其他方式隐藏,然后从你的主类暴露出加盟类的属性阻止你。

+0

我最终这样做的方式,我真的不希望通过使该协会成为一个实体,然后在每一边使用一对一的方式,如上所述。如果我并不完全鄙视地图的使用,那么我可能会研究这个建议,但是当我拥有一组定义良好的属性时,使用字符串作为属性名称并不符合我的要求。 – Mitch 2009-12-08 16:30:59

0

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