self-tracking
WCF客户机服务器应用程序中的实体。我的WCF服务返回各种实体,这些实体可以使用相应的更新方法进行更新。
这很好的工作了一段时间,但现在我有问题。为了保持重点,我将把这个讨论限制在一个特定的案例中,简化为最基本的内容。
我的一个表叫做SystemDefinition。它没有外键,但另一个表(路由)有外键。因此,它在实体模型(称为路由)中有一个导航属性。所有其他列都是标量。表和相应的实体有一个名为Id的主键列,类型为Guid。数据库是sqlservercompactv3.5。
-
-
在客户机中,对实体调用MarkAsDeleted()
-
UpdateSystem()中的代码很简单(为了清楚起见,删除了非必需的代码):
_objectContext.SystemDefinitions.ApplyChanges(system);
_objectContext.SaveChanges();
检索实体时不使用Include()子句,这意味着Routes集合为空(无论如何,如果Route中没有具有SystemDefinition外键的行,则仍会发生错误)。所以我传递给Update方法的SystemDefinition实体是
图中只有实体
. 但我还是有以下例外:
无效操作异常:
对象的键值与
中的另一个对象
在调用之前,键值是唯一的
第一个方法调用(ApplyChanges)引发异常。我确信ObjectContext是新的,为每个方法调用创建一个新的。
我已经把代码调试到它抛出的地方了ObjectContext.FixupKey,但是代码对我来说没有什么意义,而且在微软的源代码中也没有注释来说明导致它的实际情况。
当然,这个信息是误导性的?只有一个实体参与了更新。会发生什么事?