【问题标题】:How to update in nhibernate如何在 nhibernate 中更新
【发布时间】:2012-08-27 12:07:08
【问题描述】:

我是休眠新手。这就是我想要做的。

我从数据库中获取人员表和分配给他们的日程表 ID。此表中的记录由人员对象表示。让我们将人的集合称为人。在 UI 中,我可以将人员添加到此集合、删除人员并更改与人员关联的日程表 ID。我在 UI 中进行所有这些更改,并将人员对象(人员集合)发送到服务层。

服务层:

如果我这样做

people.ForEach(x => INHibernateLinqRepository<person>.Save(x));

它将人员集合中的每个人插入到表中。如果该 id 已经存在于数据库中,它不应该更新吗?

这是我尝试过的其他东西 在服务从 UI 中获取人员后,我将人员从数据库中获取到另一个集合中。然后我比较两者来决定哪些要更新,哪些要保存。然后我只在新项目上调用 save 。但随后它会抛出错误

a different object with the same identifier value was already associated with the session:

我很沮丧。有人可以帮我吗?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    NHibernate 在会话中维护自己的对象列表(有时称为“一级缓存”)。每当您从数据库中加载某个对象时,NHibernate 会话会将其存储在内部字典中,这是一个 identity map 实现。

    对象 id 是字典键。如果您尝试使用相同的会话再次加载相同的实体,NHibernate 将不会进入数据库:它会从会话中返回对象。

    当您从数据库加载项目进行比较时,NHibernate 会将它们存储在会话中。之后,您尝试保存已发送到服务层的同一对象(相同 ID)的另一个实例。 NHibernate,或者更确切地说,内部身份映射不允许您这样做,因为缓存中已经有一个具有相同 id 的项目。

    您无需从数据库中加载项目并手动进行比较。 NHibernate 很聪明,可以自己做这件事。您只需致电session.SaveOrUpdate(object)。如果没有分配对象 id,它将执行插入。如果有 id 值,它将改为更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多