私はかなり前からNHibernateの使用に成功しており、NHibernateを使用して開発し、本番環境で実行されているアプリケーションを使用して、多くの落とし穴を解決することができました。しかし、最近のハードルは本当に頭を悩ませています。
最近、子としてネストされたいくつかの新しいクラスを使用して、クラスライブラリを既存のクラスに拡張する必要がありました。すでに正常に使用していた集約マッピング用の同じモデルをコピーしましたが、今回は機能しません。
親マッピングファイルで以下を使用すると、次のようになります。
<bag name="SeaInfoItems" table="EDIImport_SeaInfo" lazy="false" cascade="save-update">
<key column="EDI_FK_OWNERID"/>
<one-to-many class="FargoGate.AppLib.EdiImportSeaInfo, FargoGate.AppLib"/>
</bag>
子クラスでは、次のいずれかを使用することを選択できます。
<property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" />
...これにより、悪名高い「Count = nのこのSqlParameterCollectionの無効なインデックスn」エラーが発生します。
または、グーグルで見つけたこのソリューションを試してみます。
<property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" insert="false" update="false" />
...これにより、「値NULLを列 'EDI_FK_OWNERID'に挿入できません...列はnullを許可しません。」エラー。
だから基本的に私は害虫とコレラのどちらかを選ばなければなりません。
私が得られないのは、それが既存の集約クラスに対して完璧に機能することであり、私は実際に違いを見つけることができません。唯一のことは、この外部キー(EDI_FK_OWNERID)が2つの異なる親テーブルを参照できることです。悪いデータベース設計は知っていますが、私はそれを設計しませんでした。それを良くも悪くも開発するのが私の仕事です。データベースの設計を変更できません。
もう1つの違いは、既存の子クラス(マッピングとクラスメンバー)から外部キー参照を完全に削除したことです。もちろんそれをエミュレートしようとしましたが、役に立ちませんでした。
また、新しいクラスの1つ(非常に小さい)も正常に機能することを発見しました。しかし、ここでも違いがわかりません。困った!
誰か手がかりがありますか?
アーグ!この悪名高い「Count = nのこのSqlParameterCollectionの無効なインデックスn」エラーで私は間違った立場に置かれたので、明らかなことを見落としました:クラスの1つのフィールドの重複マッピング。その特定のマッピングでは、主キーもプロパティとして定義されているこのエラーを残しました。
<id name="ID" column="ID">
<generator class="guid" />
</id>
<property name="ID" column="ID" />
さて、それをデバッグしようとするのは時間の無駄でした!