Я пытаюсь вставить список объектов типа foo в таблицу TB_FOO.
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 только в том случае, если он находится в добавленном состоянии.
Есть идеи, почему эта ошибка выбрасывается?
Вы, вероятно, повторно используете старый ObjectContext
.
Эта строка:
_MyEntityManager.AddToTB_FOO(foo)
• Сбой, если в контексте уже существует сущность с тем же значением первичного ключа, что и foo
. Он также потерпит неудачу, если foo
связан через свойство навигации с каким-либо другим объектом, который отсоединен, но у которого есть «двойной» объект в контексте с тем же значением первичного ключа.
Самый простой способ избежать этих проблем - использовать новый экземпляр ObjectContext
для всего метода и избавиться от него, когда вы закончите. Долгоживущие ObjectContext
s почти всегда приводят к утечкам памяти и действительно запутанным ошибкам.
Я использую это, потому что я уже создал новый экземпляр и заполнил свойства, которые мне нужно обновить.
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 #, но, надеюсь, это поможет.