2011-12-12 9 views
1

私のドメインでは、NHibernate(バージョン3.1)の観点から、完全に切断されたエンティティを扱います。したがって、私のプライマリドメインから私のrdbmsドメインにマッピングするとき、グラフには永続インスタンスと一時インスタンスが混在しているため、をrdbmsエンティティで呼び出します。すでに存在するものもあれば、新しいものもあればデータベースに追加する必要があるものもあります。 Session.Mergeの後のNHibernateオブジェクトグラフの更新されたインスタンスを取得する堅牢な方法は何ですか?

は私がSessionから得Postのオブジェクトインスタンスを有し、からマッピングの結果として作成された新しい(過渡)CommentインスタンスmyComment、以下のモデル(擬似)

class Post 
{ 
    ISet<Comment> Comments { get; set; } 
} 

class Comment 
{ 
    Post Post { get; set; } 
    string UnimportantString { get; set; } 
} 

があると

私のドメインモデル。 私は、既存の Postにこれを追加します。

myComment.Post = myPost; 
myPost.Comments.Add(myComment); 
myPost = Session.Merge(myPost); 

が、これは仕事の単位に包まれていることをしてくださいと仮定します。 Session.MergemyPostと呼ぶことにより、NHibernateは、指定されたグラフ内の既存のインスタンスを変更せず、作成された、またはすでに第1レベルのキャッシュにある別のインスタンスを返します。返されたmyPostには現在コメントの永続インスタンスが含まれていますが、元のmyCommentインスタンスには、自分のコードが参照を持つインスタンスは変更されていません。

変更したエンティティを元のドメインに戻したいのですが、から変更したCommentを選択する堅牢な方法がありません。私はmyPost.Comments.Last()が今追加したものであるとは限りません。

私は確実に私が完了した取引の結果として、IDを取得することができるように、新たに合併myPost.Commentsセットは、例えば、私のオリジナルmyCommentインスタンスに相関しているエントリ相関したいです。オリジナルのmyCommentが新しいオブジェクトだったので、私はIDでそれを行うことはできません。これははるかに複雑なグラフの簡単な例です - 他のプロパティと深いグラフがあり、NHibernateの新しいインスタンスと、元のインスタンスとの信頼性の高い関連付けができるようにしたいのですが、myCommentにSaveOrUpdateを呼び出すことはできません。

Session.Merge(myPost)の後に更新されたCommentを取得するための最良の方法は、それを私のプライマリドメインモデルにマップすることができますか?

p.s.私は私が私の簡単な例

p.p.s.で、Mergeへの単一の呼び出し、次のだけではなく、この1 Commentを参照することにも他のオブジェクトを持っているよう残念ながらちょうどmyComment = Session.Merge(myComment)への呼び出しを変更することは十分ではありません

+1

'UnimportantString' - YouTubeのコメントシステムでなければなりません。 – codekaizen

答えて

0

をこの不自然な例は、事実を隠しますが、私のRDBMSのドメインへの私のプライマリドメインからのマッピングの過程で、私は永続的な含まれていてもよいグラフで終わるので、私はSession.Mergeを使用し、一過性および/または汚れの実体私はこれに似た何かをして、NHibernateのentity version機能を使って実装しました。これを使用して、エンティティのIDを事前に入力し、更新されたエンティティと確実に一致させることができます。

関連する問題