5

特定のデータベーステーブルにレコードが存在しない場合は保存されない、かなり複雑なエンティティがあります。レコードが存在すると、エンティティは正しく保存されます。レコードには、私は例外を受信しない場合:このSqlParameterCollectionの無効なインデックスN(関連するテーブルにNULLレコードがある場合のみCount = N)

無効なインデックスNこのSqlParameterCollectionのカウント= N

でGoogleとスタックオーバーフローに最も密接に関連した質問を経由して見つかったソリューションの束を読んだ後:

私の問題はマッピングファイルの設定方法と関係があります。 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; 

私はこの例外を引き起こすというのが私のマッピングで何をしないのですか?私が見ていないこの問題の別の部分がありますか?

答えて

2

カスタマークラスからsnl_idプロパティを削除するという解決策では、問題を解決しますが、対応できないPersonテーブルレコードがなくてもsnl_idがCustomerテーブルに存在する可能性があります。それは、関連するPersonプロパティを介して取得できないときに、snl_idへのアクセスが必要になることがあるためです。

いくつかの代替解決策が考えられましたが、カスタマーテーブルのプライマリキーと顧客テーブルのsnl_idを含む顧客テーブルのビューを作成することに決めました。次に、そのプロパティをジョインを介してビューにマッピングします。

Join("v_cust_id_snl_id", j => j.KeyColumn("cust_id").Map(x => x.SnlId, "snl_id") 

この変更によって、私はケーキを食べて食べることができました。私は顧客にSnlIdプロパティを保持することができましたが、保存時に例外をスローしません。

1

子オブジェクトのプライマリキーと同様に、snl_idがCustomerのプロパティとして参照されていますか?その場合は、これが原因で受信しているエラーが発生しています。 Customerからプロパティを削除し、Personを使用して値を取得します。

関連する問題