更新现有记录时

时间:2018-04-09 16:21:15

标签: c# nhibernate

我正在维护一个现有的应用程序,我需要将性能问题指向NHibernate,以便远离它产生外连接。这没关系,我得到一个填充了数据的实体。

现在,此对象随后在C#中更新并调用Update,这是许多其他存储库类使用的C#代码中的泛型方法。调用此Update方法时,我收到一条错误消息:        " NHibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联"

它指向实体对象内的嵌套对象,但我不知道如何解决这个问题。我不想更改更新方法,以免影响使用它的类。

如果我需要恢复使用视图来获取数据,是否可以在映射配置中设置强制NHibernate使用equi-joins而不是左外连接?

我对NHibernate并不熟悉,所以任何指导/帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

这里有session.Merge(entity)解决方案。这里描述了使用分离对象:

9.4.2. Updating detached objects

小引用:

  

...

     

使用Merge(Object o)可以避免最后一种情况。这种方法   用给定的方法将给定对象的状态复制到持久对象上   相同的标识符。如果当前没有持久化实例   与会话相关联,它将被加载。该方法返回   持久化实例。如果给定实例未保存或未保存   存在于数据库中,NHibernate会保存它并将其作为一个返回   新持久化的实例。否则,给定的实例不会   与会话相关联。在大多数应用程序与分离   对象,您需要两种方法, SaveOrUpdate()Merge()

换句话说,调用Merge(entity)应解决此问题,并正确解决与“传递对象” vs “会话(已加载)对象” <相关的冲突/ p>