我正在使用Fluent NHibernate,我的设置如下:
地址对象,这是一个简单的地址字段列表。
公司对象,它有两个对地址对象的引用,MainAddress,InvoiceAddress。
我遇到的问题是,有时MainAddress和InvoiceAddress都可以引用地址表中的相同记录。
地址通过搜索来查找,使用以下内容:
ICriteria c = session.CreateCriteria(typeof(Address))
.Add(Example.Create(address).ExcludeNone());
因为单独选择了每个地址,这会导致同一记录的两个实例,这会导致NHibernate在尝试保存公司对象时呕吐。
“具有相同标识符值的其他对象已与会话相关联”
解决这个问题的最佳方法是什么?
谢谢!
答案 0 :(得分:2)
除非你在不同的会话中选择 然后混合它们(这是不正确的),NHibernate的默认行为是为同一行检索相同的实例,无论你查询多少次。< / p>
确保您使用的是单个会话。
答案 1 :(得分:1)
你应该使用NHibernate的Merge
。
<强>合并强>():
- 如果当前存在具有相同标识符的持久性实例 与会话相关联,复制 给定对象的状态到 持久化实例
- 如果当前没有与会话关联的持久性实例, 尝试从数据库加载它,或 创建一个新的持久化实例
- 返回持久化实例
- 给定的实例不会与会话相关联,它 保持独立
它与SaveOrUpdateCopy
相同,但该命令显然是 deprecated :
我认为SaveOrUpdateCopy是一种东西 已经退出NHibernate的所有人 时间和合并是添加的东西 2.1(显然是从hibernate移植的东西)。无论如何,我很高兴 NHibernate有这种能力,因为 编写和处理合并 手动操作是非常无聊的代码 写!