冬眠者!
我有一个表 [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 解决这个问题的方法。
将单元测试从 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 相关的代码。
运行测试,全部通过,签入。构建通过。去喝圣诞啤酒(因此我已经过了几天才更新这个!:-))