Невозможно прикрепить отдельную сущность: «Объект с таким же ключом уже существует в ObjectStateManager» - PullRequest
20 голосов
/ 15 июля 2009

Я пытаюсь прикрепить объект к 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.

Ответы [ 4 ]

7 голосов
/ 10 августа 2009

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

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

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

5 голосов
/ 15 ноября 2009

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

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

Dim state = a.EntityState '= Added

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

4 голосов
/ 28 августа 2009

Я столкнулся с той же проблемой в моем приложении.

Я решил проблему с помощью ObjectStateManager TryGetObjectStateEntry Method

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

0 голосов
/ 27 октября 2016

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

...