在Session.Merge之后,在NHibernate对象图中获取更新实例的有效方法是什么?

时间:2011-12-12 23:42:39

标签: c# .net nhibernate

在我的域中,我从NHibernate(3.1版)的角度完全处理断开连接的实体。因此,当从我的主域映射到我的rdbms域时,我在rdbms实体上调用Session.Merge,因为该图包含持久和瞬态实例的混合 - 一些已经存在,一些是新的,需要添加到数据库

说我有以下模型(伪)

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

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

我有一个从Post获得的Session的对象实例,以及一个新的(瞬态)Comment实例myComment,它是从我的映射中创建的领域模型。 我将其添加到现有的Post

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

请假设这是以工作单位包装的。 通过在Session.Merge上调用myPost,按照设计,NHibernate不会修改所提供图形中的现有实例,而是返回已创建或已在第1级缓存中的不同实例。因此,虽然返回的myPost现在包含注释的持久实例,但我的代码所引用的原始myComment实例尚未被修改。

我希望将修改后的实体映射回我的主域,但是我缺乏从合并的Comment中选择修改后的myPost.Comments的强大方法。我假设myPost.Comments.Last()不能保证是我刚添加的那个。

我希望强健关联新合并的myPost.Comments集合中的哪个条目与我原来的myComment实例相关联,例如,以便我可以在完成交易时获取ID。我不能通过ID来做,因为我原来的myComment是一个新对象。我无法在myComment上调用SaveOrUpdate,因为这是一个更复杂的图形的简化示例 - 还有其他属性和更深层的图形,我希望能够可靠地将NHibernate的新实例与我提供给它的原始实例相关联。

Comment之后抓取更新Session.Merge(myPost)的最佳方式是什么,以便我可以将其映射回我的主域模型?

ps 不幸的是,仅仅将呼叫更改为myComment = Session.Merge(myComment)是不够的,因为我还有其他对象,我想在一次调用Merge后引用,不仅仅是我的简化示例中的Comment

pps 这个人为的例子隐藏了这个事实,但是我使用了Session.Merge,因为在从我的主域到我的rdbms域的映射过程中,我最终得到的图表可能包含持久性,瞬态和/或脏实体

1 个答案:

答案 0 :(得分:0)

我已经做了类似的事情,我已经使用NHibernate的entity version功能实现了它。使用它,我可以提前提供实体的ID,然后可靠地匹配更新的实体。