Entity Framework 4, SQLCe с проблемой POCO при удалении

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

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

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

В чем смысл этого исключения, которого я не понимаю?


person George Taskos    schedule 13.09.2010    source источник


Ответы (1)


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

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

Обходной путь:

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

Пример:

A, (B1,B2), C — сущности.

A -- B1

C -- B2

A -- B1 -- C

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

person Tri Q Tran    schedule 06.12.2010