NHibernatians!
我有一张桌子[dbo]。[Wibble]和另一张桌子[dbo]。[WibbleExtended]。
[Wibble]是主表,[WibbleExtended]是一个可选表,其中存储了一些其他字段。 [WibbleExtended]表中的条目远少于主[Wibble]表。我认为这是在当天完成的,以解决一些空间问题(Wibble有很多行,而WibbleExtened有很多列)。
每个表的ID相同,来自外部源。
即
[dbo].[Wibble].[WibbleId]
和
[dbo].[WibbleExtended].[WibbleId]
是相同的,这两个表是如何相关的。
N.B。我无法更改架构。我对这个我几乎无法控制的遗留系统非常感兴趣。
在它周围搜索似乎一对一的映射是有问题的,而流行的智慧是使用两个多对一映射。
我的映射目前是:
<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解决这个问题的方法。
将单元测试从WibbleExtended测试移至Wibble测试类并进行必要的修改。
在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>
为Wibble POCO添加了相应的属性。
删除了与WibbleExtended相关的所有代码。
运行测试,全部通过,签入。构建通过。去了一个圣诞节啤酒(因此我在更新之前已经过了几天!: - ))
答案 0 :(得分:11)
您收到的错误:
此索引的索引n无效 带有Count = n的SqlParameterCollection。
是由于两个属性映射到同一列。使用insert = false和 在其中一个中更新= false。
参考http://groups.google.com/group/nhusers/browse_thread/thread/84830b1257efd219
答案 1 :(得分:7)
您是否考虑过使用NHibernate 2.0中引入的Join element?此元素允许您连接多个表以形成一个实体;这种关系也可以是可选的。
答案 2 :(得分:1)
点击此链接:http://www.hibernate.org/hib_docs/nhibernate/html/inheritance.html
特别是“连接子类”映射我认为你会发现有用(假设WibbleExtended继承自Wibble)。