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