【问题标题】:NHibernate multiple references to the same record from a single objectNHibernate 从单个对象对同一记录的多个引用
【发布时间】:2010-09-15 12:08:09
【问题描述】:

我正在使用 Fluent NHibernate,我的设置如下:

Address 对象,它是地址字段的简单列表。

一个 Company 对象,它有两个对地址对象的引用,MainAddress 和 InvoiceAddress。

我遇到的问题是有时 MainAddress 和 InvoiceAddress 可能会引用 Address 表中的同一记录。

地址是通过搜索查找的,使用类似于以下内容的内容:

ICriteria c = session.CreateCriteria(typeof(Address))
            .Add(Example.Create(address).ExcludeNone());

因为每个 Address 是单独选择的,这会导致同一记录的两个实例,这会导致 NHibernate 在尝试保存 Company 对象时呕吐。

“具有相同标识符值的不同对象已与会话关联”

解决此问题的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: c# .net nhibernate fluent-nhibernate


    【解决方案1】:

    除非您在不同的会话中选择然后混合它们(这是不正确的),NHibernate 的默认行为是为同一行检索相同的实例,无论您查询多少次。

    确保您使用的是单个会话。

    【讨论】:

      【解决方案2】:

      你应该使用 NHibernate 的Merge

      合并():

      • 如果当前存在具有相同标识符的持久实例 与会话关联,复制 给定对象的状态到 持久化实例
      • 如果当前没有与会话关联的持久实例, 尝试从数据库中加载它,或者 创建一个新的持久实例
      • 持久化实例被返回
      • 给定的实例没有与会话关联,它 保持分离

      它与SaveOrUpdateCopy 相同,但该命令显然是deprecated

      我认为 SaveOrUpdateCopy 是什么 已经在 NHibernate 中为所有人退出 时间和合并是添加的东西 2.1(显然是从休眠中移植的东西)。无论如何,我很高兴 NHibernate 有这个能力是因为 编写和处理合并 手动操作是很无聊的代码 写!

      【讨论】:

      • 这成功了,但我认为 Diego 是正确的,因为它是由在单独的会话中执行每个查询引起的。将研究纠正...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多