Невозможно прикрепить отдельную сущность: "Объект с таким же ключом уже существует в 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 тоже приветствуются.

4 ответа

Решение

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

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

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

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

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

Dim state = a.EntityState '= Added

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

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

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

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

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

Другие вопросы по тегам