我有一个父实体,其中包含一个子实体集合,每次访问该父实体时都需要从Web服务更新。我想我可以在集合上做一个Clear(),然后添加我从Web服务收到的实体列表。当我收到的实体与我刚刚清除的任何ID没有相同的Id时似乎工作正常但是如果任何Ids是相同的,我得到NonUniqueObjectException。由于我正在清除它们,因此在插入新实体之前不应删除它们吗?如果Ids是相同的,为什么重要?
答案 0 :(得分:1)
即使您的ID相同,对象本身实际上也不一样。您可以通过执行yourobject来验证这一点。手表中的GetHashCode()。
NHibernate认为这是一个新的数据库对象,并希望插入它。
您需要保留原始对象并将新值复制到其中。
您可以手动复制这些值,属性依次复制 - 但我建议将其设置为动态,这样您就不需要为每种对象类型设置方法。
您可以使用反射编写自己的动态方法或使用第三方映射器...尝试AutoMapper https://github.com/AutoMapper/AutoMapper
复制属性时要小心。如果您的chil对象还有其他子映射,那么您将再遇到同样的问题。
答案 1 :(得分:1)
清除方法后,保存父对象。所以它从数据库和会话中删除子进程。然后添加孩子并再次保存。
答案 2 :(得分:1)
在初始删除带有clear()的子对象之后,我必须在重新插入新子项(可能具有相同的ID)之前执行flush()。然后我做了一次保存,一切正常。