2011-08-19 18 views
10

親子エンティティをリストの子エンティティで保存(挿入)しようとしています。両方のエンティティは、主キーとしてGuidを使用します。キーはヌル入力不可であり、データベースにキー関係が設定されていません。NHibernateで親と子を同時に挿入する

保存が機能しません。子テーブルの親外部キーにnullを保存しようとしているという例外がスローされます。

私は、nhibernateがParentのキーを作成し、Childオブジェクトにそのことを知らせることを期待していました。これはNHibernateの制限ですか、またはGuidsを主キーとして使用するのですか?

このanswerは、あなたが親のmanullyを設定する必要があることを示唆しています、これは本当に唯一の方法ですか?ここで

参照のための私のマッピングです:

親のマッピング:

HasMany(x => x.Children).KeyColumn("ParentKey").Inverse().Cascade.All(); 

子供マッピング:

References(x => x.Parent).Not.Nullable().Column("ParentKey"); 

答えて

15

NHibernateのは魔法ではありません。あなたの子供が親にリファレンスを設定していない場合は、ORMだけです。なぜなら、親には子供のリファレンスがあるので、そのリファレンスは親のリファレンスであるべきだと仮定しているのでしょうか?

子エンティティにParentプロパティが設定されていない(つまり、nullであることを意味します。つまり、NHibernateがParent IDの 'null'値を保存しようとしていることを意味します)あなたの子供のテーブルに)。

これらのオブジェクトをNHibernateなしで使用する場合は、追加時に親参照を子エンティティに設定する必要があります。

編集:これは、'逆'をマッピングに指定した場合です。このコールを'Inverse'に削除する場合は、のように動作するようにしてください。は、の他端(子エンティティ)がその関係を把握することを担当しています。つまり、子の親の参照を手動で設定する必要があります。

Inverseステートメントを削除すると、Child(ren)が保存され、親が保存され、次にChild(ren)の親IDが更新されます。親のidにnull制約があるため、最初はnullの親IDを持つChildを挿入するため、まだ動作しません。

2つの解決策は、この制約を削除するか、単に親にメソッドを追加するのいずれかになりますがAddChildはと呼ばれる:

public void RemoveChild(Child childObj) 
{ 
    if (Children.Contains(childObj)) 
    { 
     Child.Parent = null; 
     Children.Remove(childObj); 
    } 
} 

public void AddChild(Child childObj) 
{ 
    childObj.Parent = this; 
    Children.Add(childObj); 
} 

するRemoveChildと呼ばれる別の方法を追加します

次に、これらのメソッドを子の追加/削除に使用します。

+1

確かに、保存する前に実行時に参照があるとは思っていません。おそらく私の質問は誤解を招き、病気の編集です.NhibernateがParentとChildrenの両方を知っていることが新しいです。適切なキーでそれらを維持する方法を知っています....あまりにも多くの質問? – Dan

+0

@ダンもっと役立つように私の答えを更新しました。 – docmanhattan

+0

マッピングと制約の詳細については、このリンクを参照してくださいhttp://wiki.fluentnhibernate.org/Fluent_mapping#Access_strategies – cpoDesign

関連する問題