2

我有一个父实体,其中包含一组子实体,几乎每次我访问该父实体时都需要从 Web 服务进行更新。我想我可以对集合执行 Clear(),然后添加从 Web 服务接收到的实体列表。当我收到的实体的 ID 与我刚刚清除的任何实体的 ID 不同时,它似乎工作正常,但如果任何 ID 相同,我会得到 NonUniqueObjectException。既然我正在清除它们,难道不应该在插入新实体之前将它们删除吗?如果 Id 相同,为什么重要?

4

3 回答 3

1

即使您的 ID 相同,但对象本身实际上并不相同。您可以通过执行您的对象来验证这一点。手表中的 GetHashCode()。

NHibernate 认为这是一个新的数据库对象并想要插入它。

您需要保留原始对象并将新值复制到其中。

您可以手动复制这些值,逐个属性 - 但我建议将此值设为动态,这样您就不需要为每种对象类型使用方法。

您可以使用反射编写自己的动态方法或使用第三方映射器...尝试 AutoMapper https://github.com/AutoMapper/AutoMapper

复制属性时要小心。如果您的 chil 对象还有其他已映射的子对象,您将再次遇到同样的问题。

于 2013-04-24T23:43:02.873 回答
1

清除方法后,保存父对象。所以它会从数据库和会话中删除孩子。然后添加孩子并再次保存。

于 2013-04-25T05:41:24.693 回答
1

在使用 clear() 初始删除子对象后,我必须在重新插入新子对象(可能具有相同的 ID)之前执行 flush()。然后我做了一个保存,一切正常。

于 2013-04-25T14:18:38.407 回答