バーナティアン!
テーブル [dbo].[Wibble] と別のテーブル [dbo].[WibbleExtended] があります。
[Wibble] はメイン テーブルで、[WibbleExtended] はその他のフィールドが保存されるオプションのテーブルです。[WibbleExtended] テーブルには、メインの [Wibble] テーブルよりもはるかに少ないエントリがあります。これは、スペースの問題を解決するために当時行われたと思います (Wibble には多くの行があり、WibbleExtened には多くの列があります)。
各テーブルの ID は同じで、外部ソースから取得されます。
いえ
[dbo].[Wibble].[WibbleId]
と
[dbo].[WibbleExtended].[WibbleId]
は同一であり、2 つのテーブルがどのように関係しているかを示しています。
注意: スキーマを変更することはできません。私はこれを、私がほとんど制御できないレガシーシステムに押し付けています。
周りを検索すると、1 対 1 のマッピングには問題があり、2 つの多対 1 のマッピングを使用するのが一般的な知恵です。
現在、私のマッピングは次のとおりです。
<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 に関連するすべてのコードを削除しました。
テストを実行し、すべて合格し、チェックインしました。ビルドは合格しました。クリスマス ビールを飲みに行きました (そのため、これを更新するまでに数日かかりました! :-))