0

我使用 SelfTracking 实体,一切正常,直到我们在参考详细信息表中添加了一些字段。我不知道引用外键有什么问题!我还没有设计数据库模式,但我可以看到一切看起来都不错!

这是堆栈跟踪的异常消息。

A circular relationship path has been detected while enforcing a referential integrity constraints. Referential integrity cannot be enforced on circular relationships.

System.Data.Entity

Void FixupForeignKeysByReference(System.Collections.Generic.List`1[System.Data.Objects.EntityEntry])

   at System.Data.Objects.EntityEntry.FixupForeignKeysByReference(List`1 visited)
   at System.Data.Objects.EntityEntry.FixupForeignKeysByReference(List`1 visited)
   at System.Data.Objects.EntityEntry.FixupForeignKeysByReference(List`1 visited)
   at System.Data.Objects.EntityEntry.FixupForeignKeysByReference()
   at System.Data.Objects.ObjectStateManager.FixupKey(EntityEntry entry)
   at System.Data.Objects.EntityEntry.AcceptChanges()
   at System.Data.Objects.EntityEntry.ChangeObjectState(EntityState requestedState)
   at System.Data.Objects.ObjectStateManager.ChangeObjectState(Object entity, EntityState entityState)
   at Aitisi.Data.Model.SelfTrackingEntitiesContextExtensions.ChangeEntityStateBasedOnObjectState(ObjectContext context, IObjectWithChangeTracker entity) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Data.Model\AitisiSelfTrackModel.Context.Extensions.cs:line 732
   at Aitisi.Data.Model.SelfTrackingEntitiesContextExtensions.HandleEntity(ObjectContext context, EntityIndex entityIndex, RelationshipSet allRelationships, IObjectWithChangeTracker entity) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Data.Model\AitisiSelfTrackModel.Context.Extensions.cs:line 597
   at Aitisi.Data.Model.SelfTrackingEntitiesContextExtensions.ApplyChanges[TEntity](ObjectContext context, String entitySetName, TEntity entity) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Data.Model\AitisiSelfTrackModel.Context.Extensions.cs:line 85
   at Aitisi.Data.Model.SelfTrackingEntitiesContextExtensions.ApplyChanges[TEntity](ObjectSet`1 objectSet, TEntity entity) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Data.Model\AitisiSelfTrackModel.Context.Extensions.cs:line 41
   at Aitisi.Repository.Data.MtrLinesRepository.Update(MTRLINES mtrLine) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Repository.Data\MtrLinesRepository.cs:line 37

这是我第一次面对这种错误。任何帮助表示赞赏。

谢谢你。

4

2 回答 2

2

我认为问题出在导航属性上。我将尝试举一个简短的例子。

假设您有两个实体 Order 和 Customer。如果您获取 Customer 并将其保存在内存中,则将其添加到 Order 对象的实例中。Order.Customer=Customer 然后 NavigationProperties 的自动修复会将订单添加到 Customer 的 Navigation 属性中。

然后,如果您创建一个新订单并将相同的客户添加到该订单,则该订单将获得与客户的导航修复,并且客户获得另一个订单,因此您最终会在客户类中获得两个订单对象的引用。如果您保存 Order 聚合根对象,则 ef 将遍历 Order 中的所有对象并在 Customer 对象中找到两个订单并尝试保存它们,但第一个订单已经保存,因此您最终会遇到异常。为避免这种情况,请勿仅使用外键对象。Order.CustomerId=客户.Id;

于 2011-05-09T23:57:15.983 回答
0

我过去遇到过这个问题:

  1. 打开上下文#1
  2. 读取对象 #1
  3. 关闭上下文 #1
  4. 做一些工作并导致创建对象#2,它是对象#1 的子对象并具有对对象#1 的引用
  5. 打开一个新的上下文,将对象 #2 添加到它的 DbSet 和 SaveChanges

由于没有在新上下文中跟踪对象#1 的状态,因此它会发出循环引用警告。

要解决这个问题,请尝试 DbSet(Of T).Attach 方法,如下面的代码所示:

Using ctx = New AtlasEntities
    modelDefinition = Await ctx.ModelDefinitions.First(Function(f) f.Id=Id)
End Using

ModelResult = modelDefinition.DoSomeWork()

Using ctx As New AtlasEntities
    ctx.ModelDefinitions.Attach(modelDefinition)
    ctx.ModelResults.Add(ModelResult)
    Dim success = Await ctx.SaveChangesQuickly.ConfigureAwait(False)
End Using
于 2016-05-06T07:06:16.673 回答