特定のデータベーステーブルにレコードがない場合に保存されない、かなり複雑なエンティティがあります。レコードが存在する場合、エンティティは正しく保存します。レコードが受信されない場合、例外が発生します。
Count=NのこのSqlParameterCollectionの無効なインデックスN
Googleで見つかった一連のソリューションと、Stack Overflowで最も密接に関連する質問を読んだ後:
- データベースの列がNullの場合、「Count=nnのこのSqlParameterCollectionのインデックスnnが無効」の原因は何ですか。
- Count=nのこのSqlParameterCollectionの無効なインデックスn」または「外部キーをnullにすることはできません
私の問題は、マッピングファイルの設定方法に関係していると思います。CustomerエンティティはPersonエンティティへの参照を持っています。Personは、読み取りは行ったが書き込みアクセスはできなかったテーブルにマップします。例外を生成するのは、Personエンティティのレコードが存在しない場合です。レコードが存在する場合は問題ありません。顧客からの人への参照をに設定しましたNullable()
。また、どちらのエンティティからもプロパティが2回マップされていないことを確認するためにダブルチェックしました。
これが適切なマッピング情報であると私が感じるものですが、必要に応じてより多くを提供することができます:
お客様
//more mapping code...
References(x => x.Person, "snl_id").Nullable();
//more mapping code...
人
//more mapping code...
ReadOnly();
Id(x => x.SnlId).Column("SNL_ID");
//more mapping code...
さらに複雑なことに、Personが存在しない場合にNHibernateのパフォーマンスを向上させるための面倒なコードがいくつかあります。ここに当てはまるかどうかはわかりませんが、私の質問に含めるのに十分適切だと思いました。以下のコードを使用しているのは、それがないとNHibernateJIRAが大量のクエリを作成するためです。このソリューションは、このStackOverflowの回答で概説されています。
お客様の所有物
public virtual Person Person
{
get
{
try
{
var snlId = per.Name;
return per;
}
catch
{
return null;
}
}
set
{
per = value;
}
}
private EPerson per;
この例外の原因となるマッピングに何が欠けていますか?私が見ていないこの問題の別の部分はありますか?