SaveChangesAsync失败并且未执行回调(IdeaBlade)

时间:2014-06-09 20:37:08

标签: entity-framework devforce

我使用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'中。声明已经终止。"

在深入挖掘中,我发现了以下内容:

  1. 涉及的两个主要类别是:估价和修订
  2. 估价有一系列修订。在数据库上,这由引用Valuation表的PK的Revision表(非null)上的FK表示。
  3. 此外,Valuation还引用了CurrentRevision。这在数据库中表示为Valuation表上的FK(如果没有修订,则可以为null),它引用了Revision表上的PK。
  4. 在问题代码中,创建了一个新的Revision对象:

    myNewRevision = new Revision { Valuation = myExistingValuation };

    此时,myNewRevision是一个IdeaBlade.EntityModel.Entity,实体状态为"已添加"。

  5. 对对象进行几次其他更改后,将执行以下代码。

    EntityManager.AddEntity(myNewRevision);

    以上对AddEntity的调用似乎无法完成任何事情,因为MyNewRevision的状态在调用之后与调用之前相同。

  6. 接下来尝试保存新创建的Revision对象。

    SaveChangesAsync(new[] { myNewRevision }, null, RevisionCallback, null);

    上面的语句在try ... catch块中并且没有抛出错误,但是从不执行RevisionCallback例程。此外,myNewRevision的EntityState仍然是"已添加"并且键仍然显示为-100。

  7. 然后使用对新版本的引用更新现有的Valuation对象。

    myExistingValuation.CurrentRevision = myNewRevision;

    这会导致myExistingValuation的EntityState从" Unchanged"更改到"修改"。

  8. 最后,代码尝试将更改保存到Valuation对象。

    SaveChangesAsync(new[] { myExistingValuation }, null, ValuationCallback, null);

  9. 此调用的结果是调用了ValuationCallback,但myExistingValuation仍显示为"已修改",对myExistingValuation.CurrentRevision的引用仍引用myNewRevision,键为-100且实体状态为"已添加"。返回到回调方法的EntitySaveOperation对象具有Exception == null,HasError = true,并且错误是在此问题开头描述的错误。也就是说,

    "提供的实体列表中缺少包含引用的临时ID的实体。缺失的实体包括:修订版:-100。有关更多详细信息,请参阅例外成员"

    " UPDATE语句与FOREIGN KEY约束冲突" FK_valuation_revision"。冲突发生在数据库" XX",table" Revision",column' RevisionID'中。声明已经终止。"

    数据库未更新。

  10. 有什么建议吗?为什么第一次调用SaveChangesAsync的回调例程没有被执行?如何才能使更新生效?

1 个答案:

答案 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);