Подтвердить что ты не робот

Не удалось подключить отдельный объект: "Объект с тем же ключом уже существует в ObjectStateManager"

Я пытаюсь привязать объект к ObjectContext. Когда я это делаю, вызывается следующее InvalidOperationException:

An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key.

Я проверил в диспетчере состояния объекта, и элемент не существует:

//Data context is actually the object context.
ObjectStateEntry contact;
while ( //Should only work once since it should be true if the item was attached
          !DataContext.ObjectStateManager.
          TryGetObjectStateEntry(Contact, out contact)
      )
      DataContext.Attach(Contact); //Here is the exception thrown.

Или посмотрите на этот абстрактный пример и скажите, если это имеет смысл:

EntityState state = Contact.EntityState; //Detached

DataContext.Attach(Contact); //Throws the exception.
DataContext.AttachTo("Entities.Contacts", Contact); //Throws the Exception

var detached = DataContext.ObjectStateManager.
                   GetObjectStateEntries(EntityState.Detached);
//InvalidArgumentException - detached entities cannot be in the obj state mgr

Ответы в VB также приветствуются.

4b9b3361

Ответ 1

Может ли ваш объект Contact иметь два дочерних объекта с тем же EntityKey? Например, можно ли получить из объекта Contact два объекта Address с тем же ключом?

Если вы укажете MergeOptions.NoTracking, контекст с радостью вернет граф отдельного объекта, содержащий объекты с одним и тем же ключом. Тем не менее, когда вы присоединяете один и тот же граф объектов, будет выбрано System.InvalidOperationException.

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

Ответ 2

Ответ (и я не упоминал, что это была проблема, поскольку я не знал, что это так), что если вы установите свойство навигации для отслеживаемого объекта, новый объект автоматически добавится:

Dim s = context.States.FirstOrDefault()
Dim a As New Address
a.State = s

Dim state = a.EntityState '= Added

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

Ответ 3

У меня была одна и та же проблема в моем приложении.

Я решил проблему, используя ObjectStateManager TryGetObjectStateEntry Method

Фактически свойство EntityState вводит в заблуждение разработчиков. Несмотря на то, что он отображает Detached, интересно, что вызывает ошибку.

Ответ 4

Проверьте, задано ли свойство EntityKey объекта Entity. Если вы его устанавливаете, убедитесь, что вы не копируете существующий объект объекта.