20

我有个问题。想象一下这个数据模型:

[Person] table has: PersonId, Name1  
[Tag] table has:  TagId, TagDescription  
[PersonTag] has: PersonId, TagId, IsActive

由于[PersonTag]不仅仅是一个简单的多对多连接表,我在 nHibernate 中创建了所有三个实体(就像它们在数据模型中一样)。PersonTag,因此,需要一个复合ID,我已将其映射到这样的类:

<composite-id name="PersonTagKey" class="PersonTagKey">
  <key-property name="PersonId"></key-property>
  <key-property name="TagId"></key-property>
</composite-id> 

我想遍历对象图并能够从检索到的对象中同时查看Person和对象。所以,我有对象的属性来做到这一点,映射如下:TagPersonTagPersonTag

<many-to-one name="Person" column="PersonId" lazy="proxy" cascade="none" class="Person"/>
<many-to-one name="Tag" column="TagId" lazy="proxy" cascade="none" class="Tag"/>

当我尝试创建一个PersonTag对象并保存它时,我收到“Invalid index n for this SqlParameterCollection with Count=n”错误。我知道这是因为我已经映射了两次PersonIdandTagId属性,一次用于复合 ID,一次用于多对一关系。如果我不映射多对一对象,那么一切正常。

有没有办法让我能够基于在同一 nHibernate 实体中建模的同一列建立复合 ID 和多对一关系?

4

1 回答 1

28

凯,这就是答案。几乎没有关于此的文档:

<composite-id name="PersonTagKey" class="PersonTagKey"> 
  <key-many-to-one name="Person" column="PersonId" lazy="proxy" class="Person">
  <key-many-to-one name="Tag" column="TagId" lazy="proxy" class="Tag"/>
</composite-id>

这将允许您创建一个由多对一关系的逆组成的复合 ID。

好猎...

于 2009-02-02T20:50:58.073 回答