5

特定のデータベーステーブルにレコードがない場合に保存されない、かなり複雑なエンティティがあります。レコードが存在する場合、エンティティは正しく保存します。レコードが受信されない場合、例外が発生します。

Count=NのこのSqlParameterCollectionの無効なインデックスN

Googleで見つかった一連のソリューションと、Stack Overflowで最も密接に関連する質問を読んだ後:

私の問題は、マッピングファイルの設定方法に関係していると思います。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;

この例外の原因となるマッピングに何が欠けていますか?私が見ていないこの問題の別の部分はありますか?

4

2 に答える 2

2

Customerクラスからsnl_idプロパティを削除するScottのソリューションは問題を修正しますが、回避できない問題が発生します。対応するPersonテーブルレコードがなくても、snl_idはCustomerテーブルに存在する可能性があります。そのため、関連付けられたPersonプロパティを介してsnl_idにアクセスできない場合に、snl_idにアクセスする必要がある場合があります。

私はいくつかの代替ソリューションを検討しましたが、Customerテーブルの主キーとcustomerテーブルのsnl_idを含むCustomerテーブルのビューを作成することに決めました。次に、ビューへの結合を介してそのプロパティをマッピングします。

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

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

于 2011-09-30T17:44:39.527 に答える
1

snl_idは、Customerのプロパティとして参照されているだけでなく、子オブジェクトの主キーでもありますか?もしそうなら、これはあなたが受け取っているエラーを引き起こしています。Customerからプロパティを削除し、Personを使用して値を取得します。

于 2011-09-28T15:07:35.757 に答える