这是我的情景:
我正在使用Silverlight,RIA和POCO对象(没有实体框架;我们正在对抗Oracle和SP)。
我有一个包含Child对象集合的Parent对象。我正确地在Parent上设置了Association和Composition属性。当我想保存更改时,整个对象图将正确发送到服务器。
用户可以向Parent添加一个或多个Child对象。
现在,如果用户将一个Child对象添加到Parent并保存它,那么一切正常。但是,当用户尝试向父级添加两个或更多新对象然后继续时,我会收到经典错误:
System.ServiceModel.DomainServices.Client.DomainOperationException:提交操作失败。此EntitySet中已存在具有相同标识的实体。 ---> System.InvalidOperationException:此EntitySet中已存在具有相同标识的实体。
现在,这在客户端失败了。我正在跟踪所有内容 - 数据库实际上已更新!一切都被正确地发送到服务器,数据库得到更新。当重新查询发生时它检查服务器上的对象键并且它们是正确的 - 所有新的子对象都将它们的ID从零更新为实数。
当我在客户端上重新加载Parent对象时,我收到此错误。我不明白。我正在为重新加载操作新建一个Context;它应该为空,只需加载Parent和关联的Children。我在检出方法之前检查服务器端的数据 - 父数据和子数据都没问题。那么发生了什么?为什么我的上下文无法完成此SubmitOperation?
答案 0 :(得分:1)
你放弃了太容易 - 不要让RIA为你做! : - )
这是交易......
由于您正在使用POCO对象(没有EF),因此您的某个属性上很可能有一个标识属性([Key]),用于指定该对象的键(或标识)。
嗯...
当您添加2个连续对象时,您很可能会将密钥值默认为0。这是域服务和问题的一个问题。上下文,因为它试图为您管理集合。好吧,如果在将对象保存到数据库之后,您还没有更新密钥,它们将保持值为0。
问题!
域名服务&上下文尝试将这两个对象放在其托管的EntitySet中,因此,所有对象必须是唯一的。
因此...
长而短缺是......将密钥保存到数据库后更新密钥值。