1

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

我从数据库中获取人员表和分配给他们的日程表 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:

我烦了。有人能帮我吗?

4

1 回答 1

3

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

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

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

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

于 2012-08-27T12:34:37.207 回答