Объект с таким же ключом уже существует в ObjectStateManager.Существующий объект находится в неизмененном состоянии - PullRequest
3 голосов
/ 08 ноября 2010

Я пытаюсь вставить список объектов типа 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 снова, если это в добавленном состоянии.

Есть идеи, почему выдается эта ошибка?

Ответы [ 2 ]

8 голосов
/ 08 ноября 2010

Вы, вероятно, повторно используете старый ObjectContext.

Эта строка:

_MyEntityManager.AddToTB_FOO(foo)

… Сбой, если в контексте уже существует объект с тем же значением первичного ключа, что и foo. Он также потерпит неудачу, если foo связан через свойство навигации с каким-либо другим объектом, который отсоединен, но имеет в контексте "двойник" с тем же значением первичного ключа.

Самый простой способ избежать этих проблем - использовать новый экземпляр ObjectContext для всего метода и избавиться от него, когда вы закончите. Долгоживущие ObjectContext почти всегда приводят к утечкам памяти и действительно запутанным ошибкам.

0 голосов
/ 07 июня 2012

Я использую это, потому что я уже создал новый экземпляр и заполнил свойства, которые мне нужно обновить.

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 #, но, надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...