1

親コレクションをマップするためにFluentを使用しています->私が行っているフレームワークデモの子コレクションシナリオ。私は少しNHibernateの初心者なので、簡単に行きます:)

私の DTO には次のマッピングがあります。

public class OrderMapping : ClassMap<OrderDTO>
{
    public OrderMapping()
    {
        Id(x => x.OrderId);
        Map(x => x.OrderDate);
        Map(x => x.Address);

        HasMany<OrderLineDTO>(x => x.OrderLines).KeyColumn("OrderId").Not.LazyLoad();
        Table("`Order`");
    }
}

public class OrderLineMapping : ClassMap<OrderLineDTO>
{
    public OrderLineMapping()
    {
        Id(x => x.OrderLineId);
        Map(x => x.OrderId).ReadOnly();
        Map(x => x.Amount);
        Map(x => x.Description);
        References<OrderDTO>(x => x.Order).Column("OrderId");
        Table("OrderLine");
    }
}

DTO オブジェクトはこれらの値を受け取るように設定されており、これはすべて正常に機能します (フレームワークに取り組んでおり、LazyLoading が完了していないため、子の LazyLoad をオフにしました)。

そこで、テスト アプリを開きます。データは 2 つのグリッドに読み込まれ、親と子が正しく表示されます。

子オブジェクトまたは親オブジェクトに変更を加えて保存しようとすると、親/子の保存用に生成された SQL が正しく、SQL に渡された値が適切であることを確認できます。唯一の問題は、更新後、 NHib は、コレクションを削除することを決定しますか? 次の SQL を試みます。

UPDATE OrderLine SET OrderId = null WHERE OrderId = 2

テーブルに OrderLine.OrderId = Order.OrderId の OrderLine から Order への FK があり、カスケードがないため、これは失敗します。さらに、コレクションに削除が必要な理由がわかりません..

NHib が「コレクションを削除できませんでした」というエラーをスローします。これは、OrderLineDTO 子から「Order」参照を削除しようとしているためですか?

編集:

実際に DTO を見ると、私のビジネス オブジェクトからのリバース マッピングでは、各 OrderLineDTO に「Order」が含まれていないように見えるので、おそらく既に解決済みです。私がそれをするとき、それを嫌います:)

編集2:

サーバー側でオブジェクトを正しく再作成しても、同じ問題が発生することがわかりました

何か案は?

4

1 に答える 1

3

それを考え出した - RTFM :P

マニュアルでは:

非常に重要な注意: アソシエーションの列が NOT NULL と宣言されている場合、NHibernate はアソシエーションを作成または更新するときに制約違反を引き起こす可能性があります。この問題を回避するには、inverse="true" としてマークされた多くの値を持つエンド (セットまたはバッグ) との双方向の関連付けを使用する必要があります。この章で後述する双方向関連の説明を参照してください。

于 2012-07-04T09:14:17.020 に答える