2010-11-08 38 views
3

我正試圖在表TB_FOO中插入foo類型的實體列表。ObjectStateManager中已存在具有相同鍵的對象。現有對象處於未更改狀態

Public Sub Insert(ByVal _lstFoo As List(Of TB_FOO)) 

    Try 
     For i As Integer = 0 To _lstFoo.Count - 1 
     Dim foo As TB_FOO = _lstFoo(i)   
     _MyEntityManager.AddToTB_FOO(foo) 
     Next 
     _MyEntityManager.SaveChanges() 
     _MyEntityManager.AcceptAllChanges() 
    Catch ex As Exception 
     Debug.WriteLine(ex.StackTrace) 
    End Try 

    End Sub 

在foo對象中有2個關係。一個是實體TB_FOO2,它是剛纔在代碼中插入的對象,另一個是從數據庫中選擇的TB_FOO3。

在循環的第一次迭代中,當它到達_MyEntityManager.AddToTB_FOO(foo)它拋出

具有相同鍵的對象已經 存在於ObjectStateManager錯誤。 現有對象處於未更改 狀態。如果對象在添加狀態下爲 ,則只能將對象添加到 ObjectStateManager中。

任何想法爲什麼會引發此錯誤?

回答

8

您可能正在重新使用舊的ObjectContext

這行:如果已經存在具有相同主鍵值作爲上下文foo實體

_MyEntityManager.AddToTB_FOO(foo) 

...將失敗。如果foo通過導航屬性關聯到某個其他已分離的實體,但在具有相同主鍵值的上下文中具有「twin」實體,則它也會失敗。

不存在這些問題的最簡單方法是對整個方法使用新的ObjectContext實例,並在完成後丟棄它。長久的ObjectContext幾乎總是會導致內存泄漏和真正令人困惑的錯誤。

+0

顯然,當我創建了_lstFoo我沒有保存並接受所有變更爲另一個對象並自動依次做了刀片......現在我保存這個方法被調用後的對象 – Drahcir 2010-11-17 07:28:20

0

我使用這個,因爲我已經創建了一個新的實例,並填充了我需要更新的屬性。

Public Sub Insert(ByVal _lstFoo As List(Of TB_FOO)) 

Try 
    For i As Integer = 0 To _lstFoo.Count - 1 
    Dim foo As TB_FOO = _lstFoo(i) 
    ObjectStateEntry ose; 
    Dim key=CreateEntityKey("TB_FOOs",foo); 
    if(ObjectStateManager.TryGetObjectStateEntry(key, out ose)) then 
     Dim entity=(TB_FOO)ose.Entity; 
     TF_FOOs.Detach(entity); 
    end if 
    _MyEntityManager.AddToTB_FOO(foo) 
    Next 
    _MyEntityManager.SaveChanges() 
    _MyEntityManager.AcceptAllChanges() 
Catch ex As Exception 
    Debug.WriteLine(ex.StackTrace) 
End Try 

End Sub 

這是EF的一個較新版本,它似乎或只是一個不同的模型。它也大多從C#翻譯,但希望它有幫助。

相關問題