簡體   English   中英

在Session.Merge之后獲取NHibernate對象圖中的更新實例的可靠方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM