代码之家  ›  专栏  ›  技术社区  ›  Chris Holmes

Silverlight&RIA&POCO:当插入两个新的子实体时,SubmitOperationFailed。存在同一ID的实体

  •  0
  • Chris Holmes  · 技术社区  · 14 年前

    我的设想是:

    我使用的是Silverlight、RIA和POCO对象(没有实体框架;我们是针对Oracle和SP的)。

    我有一个包含子对象集合的父对象。我已在父级上正确设置关联和合成属性。当我想保存更改时,整个对象图会正确地发送到服务器。

    用户可以向父对象添加一个或多个子对象。

    现在,如果用户将一个子对象添加到父对象并保存它,那么一切都会正常工作。但是,当用户尝试向父对象添加两个或多个新对象,然后继续时,会出现典型错误:

    System.ServiceModel.DomainServices.Client.DomainOperationException:提交操作失败。具有相同身份的实体已经存在于EntitySet中。----gt:Stult.ValuePosialExpExcExc:在EntitySet中已经存在一个具有相同身份的实体。

    现在,这在客户端是失败的。我正在追踪一切-数据库实际上得到了更新!所有东西都被正确地发送到服务器,数据库被更新。当重新查询发生时,我检查服务器上的对象键,它们是正确的——所有新的子对象的ID都按顺序从零更新为实数。

    当我在客户机上重新加载父对象时,就会出现此错误。我不明白。我正在重新加载操作上创建一个新上下文;它应该是空的,只加载父级和关联的子级。我在服务器端检查数据,然后再退出查询方法-父数据和子数据都很好。怎么回事?为什么我的上下文抱怨不能完成这个提交操作?

    1 回复  |  直到 14 年前
        1
  •  1
  •   J.C.    13 年前

    你放弃得太容易了-别让瑞亚为你这么做!! :-)

    这是交易。。。

    因为您使用的是POCO对象(没有EF),所以很可能在一个属性上有一个标识属性([Key]),将其指定为该对象的键(或标识)。

    好。。。

    当您添加两个连续对象时,您很可能将键的值默认为0。这是域服务上下文的问题,因为它试图为您管理集合。好吧,如果在将对象保存到数据库之后,您还没有更新密钥,那么它们都将保持值0。

    问题!

    域服务上下文试图将这两个对象放在其托管实体集中,因此,所有对象都必须是唯一的。

    所以。。。

    它的长短是。。。将键值保存到数据库后更新。