我使用DevForce 2010版本6.1.15.0中的IdeaBlade继承了构建在Silverlight 4上的应用程序。后端数据库是SQL Server 2008.在跟踪一些不起作用的更新/插入时,我发现我从对IdeaBlade.EntityModel.EntityManager.SaveChangesAsync()的调用中收到以下错误。
"提供的实体列表中缺少包含引用的临时ID的实体。缺失的实体包括:修订版:-100。有关详细信息,请参阅例外成员"
其他挖掘发现了以下附加信息。
" UPDATE语句与FOREIGN KEY约束冲突" FK_valuation_revision"。冲突发生在数据库" XX",table" Revision",column' RevisionID'中。声明已经终止。"
在深入挖掘中,我发现了以下内容:
在问题代码中,创建了一个新的Revision对象:
myNewRevision = new Revision { Valuation = myExistingValuation };
此时,myNewRevision是一个IdeaBlade.EntityModel.Entity,实体状态为"已添加"。
对对象进行几次其他更改后,将执行以下代码。
EntityManager.AddEntity(myNewRevision);
以上对AddEntity的调用似乎无法完成任何事情,因为MyNewRevision的状态在调用之后与调用之前相同。
接下来尝试保存新创建的Revision对象。
SaveChangesAsync(new[] { myNewRevision }, null, RevisionCallback, null);
上面的语句在try ... catch块中并且没有抛出错误,但是从不执行RevisionCallback例程。此外,myNewRevision的EntityState仍然是"已添加"并且键仍然显示为-100。
然后使用对新版本的引用更新现有的Valuation对象。
myExistingValuation.CurrentRevision = myNewRevision;
这会导致myExistingValuation的EntityState从" Unchanged"更改到"修改"。
最后,代码尝试将更改保存到Valuation对象。
SaveChangesAsync(new[] { myExistingValuation }, null, ValuationCallback, null);
此调用的结果是调用了ValuationCallback,但myExistingValuation仍显示为"已修改",对myExistingValuation.CurrentRevision的引用仍引用myNewRevision,键为-100且实体状态为"已添加"。返回到回调方法的EntitySaveOperation对象具有Exception == null,HasError = true,并且错误是在此问题开头描述的错误。也就是说,
"提供的实体列表中缺少包含引用的临时ID的实体。缺失的实体包括:修订版:-100。有关更多详细信息,请参阅例外成员"
和
" UPDATE语句与FOREIGN KEY约束冲突" FK_valuation_revision"。冲突发生在数据库" XX",table" Revision",column' RevisionID'中。声明已经终止。"
数据库未更新。
有什么建议吗?为什么第一次调用SaveChangesAsync的回调例程没有被执行?如何才能使更新生效?
答案 0 :(得分:0)
奇怪的是没有调用RevisionCallback,但是当你执行后续步骤时,async方法可能还没有完成。
你不能在这里使用try / catch和异步方法,因为DevForce 2010不使用更新的基于任务的异步模式;因此异常将返回到您的回调或完成处理程序,或者可能返回到EntityServerError处理程序(如果为EntityManager设置了一个)。
除非您指定保存列表,否则DevForce将默认保存对缓存中实体的所有更改,但该列表不必仅包含一个项目。当您使用临时ID保存实体时,具有临时PK或FK的所有实体都需要位于传递给SaveChangesAsync的保存列表中。保存成功完成后,DevForce将自动处理FK的修复。
是否有任何理由你不能做以下事情:
myNewRevision = new Revision { Valuation = myExistingValuation };
myExistingValuation.CurrentRevision = myNewRevision;
SaveChangesAsync(ValuationCallback);