1

我有一个自引用表,有时有一个自引用实体,如下所示:( 是的,IdFamily 可以为空)

...
//At my Business
newFile.Family = newFile;
...
//At my ASP.NET MVC action I call:
context.SaveChanges();

它抛出一个 DbUpdateException:

[UpdateException: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.]
   System.Data.Mapping.Update.Internal.UpdateTranslator.DependencyOrderingError(IEnumerable`1 remainder) +4302030
   System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter) +4300384
   System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options) +583
   System.Data.Entity.Internal.InternalContext.SaveChanges() +382

[DbUpdateException: Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.]
   System.Data.Entity.Internal.InternalContext.SaveChanges() +485
   System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +63
   System.Data.Entity.DbContext.SaveChanges() +75

解决方法很难看,因为我需要调用 SaveChanges,设置 Id 并再次调用 SaveChanges。破坏 UnitOfWork,因此要解决此问题,我需要将所有请求放入 TransactionScope 中。

...
//At my Business
//newFile.Family = newFile;
context.SaveChanges();//BREAK UNIT OF WORK
newFile.IdFamily = newFile.Id;
...
//At my ASP.NET MVC action I call(Action Wrapped in TransactionScope):
context.SaveChanges();
4

1 回答 1

1

这里的问题是,这需要两次写入数据库以保存单个实体(一个用于获取存储生成的 PK,另一个用于将该 PK 保存到 FK)或更新管道和提供程序模型生成更多实体的能力复杂的 SQL 可以在服务器上完成这一切。目前更新管道不支持其中任何一个。

正如您所说,解决方法是手动执行双重保存。

我认为我们没有跟踪此特定问题的错误,因此我建议您在 CodePlex 上提交一个。你也可以考虑提供一个修复——我不确定修复会有多困难,因为我对更新管道代码不是很熟悉。

于 2013-02-25T18:21:59.177 回答