特定のデータベーステーブルにレコードが存在しない場合は保存されない、かなり複雑なエンティティがあります。レコードが存在すると、エンティティは正しく保存されます。レコードには、私は例外を受信しない場合:このSqlParameterCollectionの無効なインデックスN(関連するテーブルにNULLレコードがある場合のみCount = N)
無効なインデックスNこのSqlParameterCollectionのカウント= N
でGoogleとスタックオーバーフローに最も密接に関連した質問を経由して見つかったソリューションの束を読んだ後:
- What's causing “Invalid index nn for this SqlParameterCollection with Count=nn” when a column is Null in the database?
- Invalid Index n for this SqlParameterCollection with Count=n” OR “foreign key cannot be null
私の問題はマッピングファイルの設定方法と関係があります。 Customerエンティティは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...
さらに問題を複雑にするには私たちは、NHibernateがPerson存在しない。私はそれがここに当てはまるとは確信していませんが、それは私の質問に含めるのに十分なものだと思っていました。 NHibernate JIRAがなければ、たくさんのクエリを作成するので、以下のコードを使用しています。この解決方法は、Stack Overflow answerに概要が記載されています。
お客様の人物プロパティ
public virtual Person Person
{
get
{
try
{
var snlId = per.Name;
return per;
}
catch
{
return null;
}
}
set
{
per = value;
}
}
private EPerson per;
私はこの例外を引き起こすというのが私のマッピングで何をしないのですか?私が見ていないこの問題の別の部分がありますか?