2011-12-17 6 views
1

データベース内の2つのテーブルの間に識別関係があります。HasOne関係を特定できない

親テーブルには、IDによって生成される主キーがあります。子テーブルには、親テーブルのID生成プライマリキーであるプライマリキーがあります。それは真の1対1です。

私はいくつかのマッピング方法を試しましたが、あらゆる種類の結果がありますが、どれも完璧ではありません。

親マッピングファイルは、このた(Cascade.Allを(気づき) - 私は親が関係を管理するために期待する):

Id(Reveal.Member<ChildObject>("ID")) 
.GeneratedBy.Foreign("ParentObject"); 
HasOne(Reveal.Member<ChildObject, ParentObject>("ParentObject")) 
.Constrained() 
.ForeignKey(); 

I:

HasOne(x => x.ChildObject).Cascade.All(); 

子マッピングは、この持っています無実を守るためにオブジェクト名を変更しました。

だからここで何が起こるのですか?私は親のインスタンスを作成し、子のインスタンスを作成して関係を設定します(子を親に追加し、親を子に追加します)。

私はこのコードを実行します。

session.SaveOrUpdate(_Parent); 
session.Clear(); 
transaction.Commit(); 

私が起こることを期待し、何が親のIDがデータベースから親に更新されて、保存されますです。次に、IDをChildに設定し、Childを保存します。

代わりに、親は保存されますが、子は保存されません(nHibernateが実行中の挿入ステートメントが表示され、Childオブジェクトはデータベースに表示されません)。

子は親からのIDを持っていますが、親から子へ正しく伝搬されていますが、nHibernateは子をダーティ(私の一部の推測)として認識しません。子オブジェクトに対してSaveOrUpdateを明示的に試しても、保存されません。

しかし、それは少し怪しいです。子に汚れたオブジェクトのコレクションを添付して、SaveOrUpdate を子の明示的にと呼ぶと、nHhiberanteは子とコレクションを保持します。しかし、私はまだそれを明示的に呼び出さなければなりません。

親子関係のマッピングに間違いがありますか?

答えて

1

私の推測では、parent.Idはアイデンティティによって生成されます。

session.SaveOrUpdate(_Parent);は、親を保存してそのIDを取得し、コミット時にフラッシュする子の挿入をキャッシュします。 session.Clear();はキャッシュされたインサートを削除し、何もしないでください。transaction.Commit();

+0

ありがとう、フィロ - それは答えでした。 nHibernateが親オブジェクトを保存する理由は理解できませんが、トランザクションがコミットされるまで子オブジェクトは保存されません。それはファサードのようなものです。私はそれがパフォーマンス上の利点だと思います。 とにかく、素晴らしい答えをいただきありがとうございます。 –

+0

はい、すべての挿入が1回の往復で送信されるため、NHがIDを取得するために挿入を発行する必要があるIDを除き、パフォーマンスが向上します – Firo

関連する問題