nHibernate 2.0-映射复合id*和*多对一关系原因“;无效索引“;错误

nHibernate 2.0-映射复合id*和*多对一关系原因“;无效索引“;错误,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有个问题。想象一下这个数据模型: [Person] table has: PersonId, Name1 [Tag] table has: TagId, TagDescription [PersonTag] has: PersonId, TagId, IsActive 由于[PersonTag]不仅仅是一个简单的多对多联接表,我在nHibernate中创建了所有三个实体(与数据模型中的实体完全相同)PersonTag需要一个复合id,我已将其映射到如下类: <composit

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

[Person] table has: PersonId, Name1  
[Tag] table has:  TagId, TagDescription  
[PersonTag] has: PersonId, TagId, IsActive
由于
[PersonTag]
不仅仅是一个简单的多对多联接表,我在nHibernate中创建了所有三个实体(与数据模型中的实体完全相同)<因此,code>PersonTag需要一个复合id,我已将其映射到如下类:

<composite-id name="PersonTagKey" class="PersonTagKey">
  <key-property name="PersonId"></key-property>
  <key-property name="TagId"></key-property>
</composite-id> 
<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
对象并保存它时,我得到了一个“无效的索引n,用于此SqlParameterCollection,计数=n”错误。我知道这是因为我已经映射了
PersonId
TagId
属性两次,一次用于复合id,一次用于多对一关系。如果我不将多个对象映射到一个对象,那么一切都可以正常工作


有什么方法可以让我基于同一个nHibernate实体中建模的同一列拥有一个复合id和多对一关系吗?

Kay,下面是答案。几乎没有关于这方面的文档:

<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


很好的搜索…

顺便说一句,我刚刚在composite-id中遇到了“关键多对一”子元素。。。可能是这样吗?你说几乎没有这方面的文档!你能帮我澄清一下吗?最后的类定义是什么样的?它们是类Person{ISet PersonTags;}类Tag{ISet PersonTags;}类PersonTag{PersonTagKey;bool IsActive;}类PersonTagKey{Person Person;Tag Tag;}你明白了!唯一的区别是我使用的是列表,而不是ISet。这最终对你有用吗?非常感谢你发现了这一点-我只是一头撞进去了。看起来所有东西都必须是对象。供未来搜索者参考:您可以通过指定相关子对象值的完整路径来添加标准限制:
restrictions.Eq(“PersonTagKey.Person.Id”,123)