[英]What's a robust way of obtaining updated instances in an NHibernate object graph after a Session.Merge?
在我的領域中,我從NHibernate(版本3.1)的角度完全處理不連貫的實體。 因此,當從主域映射到rdbms域時,我在rdbms實體上調用Session.Merge
,因為該圖包含持久性實例和瞬態實例的混合-有些已經存在,有些是新的,需要添加到數據庫中。
說我有以下模型(偽)
class Post
{
ISet<Comment> Comments { get; set; }
}
class Comment
{
Post Post { get; set; }
string UnimportantString { get; set; }
}
我有一個從Session
獲得的Post
對象實例,還有一個新的(瞬態) Comment
實例myComment
,它是根據我的域模型進行映射而創建的。 我將其添加到現有的Post
:
myComment.Post = myPost;
myPost.Comments.Add(myComment);
myPost = Session.Merge(myPost);
請假設將其包裝在工作單元中。 通過在myPost
上調用Session.Merge
,NHibernate不會修改提供的圖中的現有實例,而是返回已創建或已經在第一級緩存中的不同實例。 因此,盡管返回的myPost
現在包含注釋的持久實例,但是我的代碼所引用的原始myComment
實例尚未修改。
我希望將修改后的實體映射回我的主域,但是我缺少從合並的myPost.Comments
選擇修改后的Comment
的可靠方法。 我假設myPost.Comments.Last()
不能保證是我剛剛添加的。
我希望牢固地關聯新合並的myPost.Comments
集中的哪個條目與我的原始myComment
實例相關,例如,以便我可以在事務完成后獲取ID。 我無法通過ID進行操作,因為我原來的myComment是一個新對象。 我無法在myComment上調用SaveOrUpdate,因為這是復雜得多的圖的簡化示例-還有其他屬性和更深的圖,並且我希望能夠可靠地將NHibernate的新實例與我提供給它的原始實例相關聯。
在Session.Merge(myPost)
之后獲取更新的Comment
的最佳方法是什么,以便我可以將其映射回我的主域模型?
ps不幸的是,僅更改對myComment = Session.Merge(myComment)
的調用是不夠的,因為我也想在一次調用Merge
引用其他對象,而不僅僅是我的簡化示例中的這個Comment
pps這個人為的例子掩蓋了事實,但是我使用Session.Merge,因為在從主域到rdbms域的映射過程中,我最終得到了一個可能包含持久,瞬態和/或臟實體的圖
我已經做了類似的事情,並使用NHibernate的實體版本功能實現了它。 使用此功能,我可以提前提供實體的ID,然后可靠地匹配更新的實體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.