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