在我的域中,我从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域的映射过程中,我最终得到的图表可能包含持久性,瞬态和/或脏实体