0

我从 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”、表“Revision”、列“RevisionID”中。该语句已终止。”

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

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

    myNewRevision = new Revision { Valuation = myExistingValuation };

    此时,myNewRevision 是一个IdeaBlade.EntityModel.Entity,EntityState 为“Added”。

  5. 在对对象进行几次额外更改后,将执行以下代码。

    EntityManager.AddEntity(myNewRevision);

    上面对 AddEntity 的调用似乎没有完成任何事情,因为调用后 MyNewRevision 的状态与调用前的状态相同。

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

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

    上面的语句在 try...catch 块中,不会抛出任何错误,但不会执行 RevisionCallback 例程。此外,myNewRevision 的 EntityState 仍为“已添加”,密钥仍显示为 -100。

  7. 然后使用对新修订版的引用来更新现有的评估对象。

    myExistingValuation.CurrentRevision = myNewRevision;

    这会导致 myExistingValuation 的 EntityState 从“未更改”更改为“已修改”。

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

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

  9. 此调用的结果是调用了 ValuationCallback,但 myExistingValuation 仍显示为“Modified”,对 myExistingValuation.CurrentRevision 的引用仍引用键为 -100 且 EntityState 为“Added”的 myNewRevision。回调方法返回的EntitySaveOperation对象有Exception == null,HasError = true,错误就是本题开头描述的那个。那是,

    “提供的实体列表中缺少一个或多个包含引用的临时 ID 的实体。缺少的实体包括:修订:-100。有关更多详细信息,请参阅异常成员”

    “UPDATE 语句与 FOREIGN KEY 约束“FK_valuation_revision”冲突。冲突发生在数据库“XX”、表“Revision”、列“RevisionID”中。该语句已终止。”

    数据库未更新。

有什么建议么?为什么不执行第一次调用 SaveChangesAsync 的回调例程?如何使更新正常工作?

4

1 回答 1

0

奇怪的是没有调用 RevisionCallback,但是当您执行后续步骤时,异步方法可能尚未完成。

您不能在此处将 try/catch 与异步方法一起使用,因为 DevForce 2010 不使用更新的基于任务的异步模式;因此异常将返回到您的回调或完成处理程序,或者如果为 EntityManager 设置了一个,则可能返回到 EntityServerError 处理程序。

默认情况下,除非您指定保存列表,否则 DevForce 将在缓存中保存对实体的所有更改,但该列表不必仅包含一项。当您保存具有临时 ID 的实体时,所有具有临时 PK 或 FK 的实体都需要位于传递给 SaveChangesAsync 的保存列表中。保存成功后,DevForce 将自动处理对 FK 的修复。

是否有任何理由您不能执行以下操作:

myNewRevision = new Revision { Valuation = myExistingValuation };
myExistingValuation.CurrentRevision = myNewRevision; 
SaveChangesAsync(ValuationCallback);
于 2014-06-09T22:12:14.603 回答