NHibernate映射 – 一对一(或一对零)

NHibernatians!

我有一张桌子[dbo]。[Wibble]和另一张桌子[dbo]。[WibbleExtended]。

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

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

[dbo].[Wibble].[WibbleId] 

 [dbo].[WibbleExtended].[WibbleId] 

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

NB我无法更改架构。 我把它变成了一个我几乎无法控制的遗留系统。

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

我的映射目前是:

       

       

这个问题是我遇到了诸如此类的错误

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

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

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

正确答案的免费碎肉馅饼。

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

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

  2. 在Wibble.hbm.xml中添加了以下内容

          
  3. 为Wibble POCO添加了相应的属性。

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

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

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

你得到的错误:

具有Count = n的此SqlParameterCollection的索引n无效。

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

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

看看这个链接: http : //www.hibernate.org/hib_docs/nhibernate/html/inheritance.html

特别是“连接子类”映射我认为你会发现有用(假设WibbleExtendedinheritance自Wibble)。