2009-07-15 2 views
20

Я пытаюсь прикрепить объект к ObjectContext. Когда я делаю так, следующий InvalidOperationException выбрасывается:Не удается подключить отдельный объект: «Объект с тем же ключом уже существует в ObjectStateManager»

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 также приветствуются.

ответ

7

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

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

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

+0

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

4

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

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

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

5

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

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

Dim state = a.EntityState '= Added 

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

+0

Связанные: http://stackoverflow.com/questions/8759699/entity-framework-creating-new-entity-with-relationship-to-existing-entity-resul – Andre

0

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

Смежные вопросы

 Смежные вопросы