C# 实体框架和自引用表以及自引用实体

C# 实体框架和自引用表以及自引用实体,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我有一个自引用表,有时有一个自引用实体,如下所示: (是的,IdFamily可为空) 它抛出一个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.]

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

它抛出一个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();

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

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


我认为我们没有跟踪这个特定问题的bug,所以我建议您在CodePlex上提交一个。你也可以考虑提供修复——我不确定修复会有多困难,因为我不太熟悉更新流水线代码。

这里的问题是,这两个写需要对数据库进行一次保存来保存一个实体(一个获得存储生成的PK,另一个保存PK到FK)。或者更新管道和提供程序模型能够生成更复杂的SQL,这些SQL可以在服务器上完成这一切。目前,更新管道不支持这两种情况

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


我认为我们没有跟踪这个特定问题的bug,所以我建议您在CodePlex上提交一个。你也可以考虑提供修复——我不确定修复会有多困难,因为我不太熟悉更新流水线代码。< / P>听上去很难过,但是谢谢你的澄清。我找不到关于它的任何信息,只是用不同的实体自我引用表。我很乐意为EF做出贡献,我计划实现DbContext.IsDirty。另外,我只是不知道我是否有这个技能,EF代码库是巨大的。听到这个消息我很难过,但谢谢你的澄清。我找不到关于它的任何信息,只是用不同的实体自我引用表。我很乐意为EF做出贡献,我计划实现DbContext.IsDirty。另外,我只是不知道我是否有这个技能,EF代码库是巨大的。
...
//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();