Entity Framework 4, SQLCe с проблемой POCO при удалении - PullRequest
2 голосов
/ 13 сентября 2010

У меня есть база данных SQLCe с уникальным идентификатором первичного ключа с типом uniqueidentifier и дочерним отношением, 1 ко многим, где я храню основной идентификатор в столбце и добавляю уникальный идентификатор для каждой строки. Теперь я использую сущности POCO для моей доменной модели NOT STE. Хотя добавление и изменение сущностей работает нормально, мне трудно удалить, скажем, пока отдельные дочерние записи, где, конечно, предполагается, что они имеют собственный первичный ключ. Как только я даю удаленный список и перебираю каждую сущность, пока первая сущность присоединена, во второй я получаю исключение:

Объект с таким же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.

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

Какое значение для этого исключения я не понимаю?

1 Ответ

0 голосов
/ 07 декабря 2010

Это исключение возникает, когда у вас есть два разных экземпляра одного и того же объекта в вашем графе объектов.Это исключение также встречается в STE, но для этого есть обходной путь.

По сути, у вас есть два объекта (POCO), каждый из которых имеет отношение к третьему объекту.Когда вы попытаетесь связать первый объект со вторым и попытаться сохранить его в контексте объекта, оба объекта будут иметь отдельный экземпляр третьего, и именно в этом и заключается ошибка.

Работа-вокруг:

Прежде чем связывать две сущности, попробуйте объединить любые связанные сущности.Это связано с тем, что контексту сущности не требуется принимать решение о том, какой экземпляр «общей сущности» сохраняться.

Пример:

A, (B1, B2), C являются сущностями.

A - B1

C - B2

A - B1 - C

В этом сценарии, B1 и B2 - оба объекта B, просто разные экземпляры (может быть из-за разных обращений к хранилищу данных в разных контекстах).Если вы хотите связать A и C, вы должны удалить B2 и связать C с B1.

...