7

冬眠者!

我有一个表 [dbo].[Wibble] 和另一个表 [dbo].[WibbleExtended]。

[Wibble] 是主表,[WibbleExtended] 是一个可选表,其中存储了一些其他字段。[WibbleExtended] 表中的条目比主 [Wibble] 表中的条目少得多。我认为这是为了解决一些空间问题(Wibble 有很多行,而 WibbleExtened 有很多列)。

每个表的 ID 都是相同的,并且来自外部源。

IE

[dbo].[Wibble].[WibbleId]

[dbo].[WibbleExtended].[WibbleId]

是相同的,并且这两个表是如何关联的。

注意我无法更改架构。我把它硬塞到一个我几乎无法控制的遗留系统上。

搜索似乎一对一的映射是有问题的,流行的智慧是使用两个多对一的映射。

我目前的映射是:

<class name="Wibble" table="Wibble" >
   <id name="Id" column="WibbleId" type="Int32">
      <generator class="assigned"/>
   </id>

   <many-to-one name="WibbleExtended" class="WibbleExtended" column="WibbleId" not-null="false" cascade="all"/>
</class>

<class name="WibbleExtended" table="WibbleExtended" >
   <id name="Id" column="WibbleId" type="Int32">
        <generator class="assigned" />
   </id>

   <many-to-one name="Wibble" class="Wibble" column="WibbleId" not-null="true" />     
 </class>

问题是我遇到了错误,例如

System.IndexOutOfRangeException: Invalid index n for this SqlParameterCollection with Count=n.

我环顾四周,这看起来确实是正确的策略,它只是落在了最后的障碍上。

问题是 id 生成器吗?映射的其他方面?

免费肉馅饼以获得正确答案。

编辑:好的 - 这是我通过@James Gregory 解决这个问题的方法。

  1. 将单元测试从 WibbleExtended 测试移至 Wibble 测试类并进行了必要的修改。

  2. 将以下内容添加到 Wibble.hbm.xml

    <join table="WibbleExtended" optional="true">
         <key column="WibbleId"/>
         <property name="Blah1" column="Blah1" type="String" length="2000" not-null="false" />
         <property name="Blah2" column="Blah2" type="String" length="1000" not-null="false" />    
    </join>
    
  3. 在 Wibble POCO 中添加了相应的属性。

  4. 删除了所有与 WibbleExtended 相关的代码。

  5. 运行测试,全部通过,签入。构建通过。去喝圣诞啤酒(因此我已经过了几天才更新这个!:-))

4

3 回答 3

11

你得到的错误:

此 SqlParameterCollection 的索引 n 无效,Count=n。

是由于两个属性映射到同一列。在两者之一中使用 insert=false 和 update=false 。

参考http://groups.google.com/group/nhusers/browse_thread/thread/84830b1257efd219

于 2009-04-24T09:30:19.800 回答
8

您是否考虑过使用NHibernate 2.0 中引入的Join 元素?此元素允许您连接多个表以形成一个实体;这种关系也可以是可选的。

于 2008-12-23T14:25:27.467 回答
1

查看此链接: http ://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

特别是“加入的子类”映射,我认为您会发现它很有帮助(假设 WibbleExtended 继承自 Wibble)。

于 2008-12-23T14:47:28.703 回答