【问题标题】:What's a robust way of obtaining updated instances in an NHibernate object graph after a Session.Merge?在 Session.Merge 之后在 NHibernate 对象图中获取更新实例的可靠方法是什么?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2015-10-27
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多