【发布时间】:2011-12-12 23:42:39
【问题描述】:
在我的领域中,我从 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 以便我可以将其映射回我的主域模型的最佳方法是什么?
p.s. 不幸的是,仅将调用更改为 myComment = Session.Merge(myComment) 是不够的,因为我还有其他对象,我想在一次调用 Merge 后引用这些对象,而不仅仅是这个一个Comment 在我的简化示例中
p.p.s. 这个人为的例子隐藏了事实,但我使用 Session.Merge 因为在从我的主域映射到我的 rdbms 域的过程中,我最终得到一个可能包含的图表持久、瞬态和/或脏实体
【问题讨论】:
-
UnimportantString- 必须是 YouTube 评论系统。
标签: c# .net nhibernate