7

バーナティアン!

テーブル [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を介してこれを解決するために私がしたことは次のとおりです。

  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

あなたが得ているエラー:

Count=n のこの SqlParameterCollection のインデックス n が無効です。

これは、同じ列にマップされた 2 つのプロパティによるものです。2 つのうちの 1 つで、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 要素の使用を検討しましたか? この要素を使用すると、複数のテーブルを結合して 1 つのエンティティを形成できます。その関係はオプションにすることもできます。

于 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 に答える