0

我使用SelfTracking實體,一切工作正常,直到我們在參考詳細信息表中添加了一些字段。我不明白引用外鍵有什麼問題!我沒有設計數據庫模式,但我可以看到一切看起來不錯!實體框架4 InvalidOperationException雖然插入或更新

這是堆棧跟蹤的異常消息。

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 

這是我第一次遇到這種錯誤。 任何幫助表示讚賞。

謝謝。

+1

這是很難說發生了什麼,如果你不顯示在你的模型有什麼改變,你在做什麼修改。順便說一句。這裏是相同的問題:http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/86aae7f5-88f5-4473-8f69-8030973bf544 – 2011-05-09 21:21:23

回答

2

我認爲問題出在導航屬性上。我會盡量舉個簡短的例子。

假設您有兩個實體Order和Customer。 如果您獲取客戶並將其保存在內存中,然後將其添加到訂單對象例如實例中。 Order.Customer = Customer,那麼NavigationProperties的自動修正會將訂單添加到Customer的導航屬性中。

如果您隨後創建一個新訂單並將相同的客戶添加到訂單中,那麼訂單將獲得與客戶的 導航修正,並且客戶獲得另一個訂單,從而最終得到兩個客戶類中Order對象的引用。如果保存Order聚合根對象,則ef將遍歷Order中的所有對象,並在Customer對象中查找兩個訂單並嘗試保存它們,但第一個已保存,因此最終會出現異常。爲了避免這種情況,請不要僅使用對象的外鍵。 Order.CustomerId = Customer.Id;

+0

無法解決它,更改爲POCOs和目前看起來不錯。 – 2011-05-10 14:10:18

0

我已經在過去的這個問題時:

  1. 開放環境#1
  2. 閱讀對象#1
  3. 關閉環境#1
  4. 不要在創作的一些工作和成果對象#2,它是對象#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