NHibernate从单个对象多次引用相同的记录

时间:2010-09-15 12:08:09

标签: c# .net nhibernate fluent-nhibernate

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

地址对象,这是一个简单的地址字段列表。

公司对象,它有两个对地址对象的引用,MainAddress,InvoiceAddress。

我遇到的问题是,有时MainAddress和InvoiceAddress都可以引用地址表中的相同记录。

地址通过搜索来查找,使用以下内容:

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

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

  

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

你应该使用NHibernate的Merge

  

<强>合并():

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

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

  

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