我从 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”中。该语句已终止。”
在深入挖掘中,我发现了以下内容:
- 涉及的两个主要类别是:估值和修订
- 估值有一系列修订。在数据库中,这由引用 Valuation 表的 PK 的 Revision 表(非空)上的 FK 表示。
- 此外,Valuation 引用了 CurrentRevision。这在数据库中表示为 Valuation 表上的 FK(如果没有修订,则可以为 null),它引用 Revision 表上的 PK。
在问题代码中,创建了一个新的 Revision 对象,如下所示:
myNewRevision = new Revision { Valuation = myExistingValuation };
此时,myNewRevision 是一个IdeaBlade.EntityModel.Entity,EntityState 为“Added”。
在对对象进行几次额外更改后,将执行以下代码。
EntityManager.AddEntity(myNewRevision);
上面对 AddEntity 的调用似乎没有完成任何事情,因为调用后 MyNewRevision 的状态与调用前的状态相同。
接下来尝试保存新创建的 Revision 对象。
SaveChangesAsync(new[] { myNewRevision }, null, RevisionCallback, null);
上面的语句在 try...catch 块中,不会抛出任何错误,但不会执行 RevisionCallback 例程。此外,myNewRevision 的 EntityState 仍为“已添加”,密钥仍显示为 -100。
然后使用对新修订版的引用来更新现有的评估对象。
myExistingValuation.CurrentRevision = myNewRevision;
这会导致 myExistingValuation 的 EntityState 从“未更改”更改为“已修改”。
最后,代码尝试保存对 Valuation 对象的更改。
SaveChangesAsync(new[] { myExistingValuation }, null, ValuationCallback, null);
此调用的结果是调用了 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 的回调例程?如何使更新正常工作?