我正在维护一个现有的应用程序,我需要将性能问题指向NHibernate,以便远离它产生外连接。这没关系,我得到一个填充了数据的实体。
现在,此对象随后在C#中更新并调用Update,这是许多其他存储库类使用的C#代码中的泛型方法。调用此Update方法时,我收到一条错误消息: " NHibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联"
它指向实体对象内的嵌套对象,但我不知道如何解决这个问题。我不想更改更新方法,以免影响使用它的类。
如果我需要恢复使用视图来获取数据,是否可以在映射配置中设置强制NHibernate使用equi-joins而不是左外连接?
我对NHibernate并不熟悉,所以任何指导/帮助都会受到赞赏。
答案 0 :(得分:0)
这里有session.Merge(entity)
解决方案。这里描述了使用分离对象:
9.4.2. Updating detached objects
小引用:
...
使用
Merge(Object o)
可以避免最后一种情况。这种方法 用给定的方法将给定对象的状态复制到持久对象上 相同的标识符。如果当前没有持久化实例 与会话相关联,它将被加载。该方法返回 持久化实例。如果给定实例未保存或未保存 存在于数据库中,NHibernate会保存它并将其作为一个返回 新持久化的实例。否则,给定的实例不会 与会话相关联。在大多数应用程序与分离 对象,您需要两种方法, SaveOrUpdate()和Merge()
。
换句话说,调用Merge(entity)
应解决此问题,并正确解决与“传递对象” vs “会话(已加载)对象” <相关的冲突/ p>