插入或更新时实体框架4 InvalidOperationException

时间:2011-05-09 14:55:25

标签: c# entity-framework-4 invalidoperationexception self-tracking-entities

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

以下是stacktrace的异常消息。

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

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

谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

过去我遇到过这个问题:

  1. 打开上下文#1
  2. 阅读对象#1
  3. 关闭上下文#1
  4. 做一些工作并导致创建对象#2,它是对象#1的子对象并且引用对象#1
  5. 打开新上下文,将对象#2添加到其DbSet和SaveChanges
  6. 由于在新的上下文中没有跟踪对象#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