Как я могу глубоко клонировать сущность и избежать ошибок, вызванных свойствами навигации? - PullRequest
3 голосов
/ 12 июля 2011

Свойства навигации моего объекта приводят к сбою моего глубокого клона с ошибкой:

"Объект с таким же ключом уже существует в ObjectStateManager"

Справочная информация:

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

_context.Detach(currentParentEntity);
_context.AddToParentEntities(currentParentEntity);
_context.SaveChanges();

Я нашел это решение и другую рабочую технику поверхностного клонирования (от diamandiev) здесь .

Так как мне действительно нужна глубокая копия, я попытался реализовать метод клонирования сериализации, показанный здесь , здесь и здесь .Мой код вызова выглядит следующим образом:

ParentEntity clonedParentEntity = (ParentEntity)DeepClone(currentParentEntity);
_context.Detach(currentParentEntity);
clonedParentEntity.EntityKey = null;
_context.AddToParentEntities(clonedParentEntity);
_context.SaveChanges();

Этот код работает только при клонировании currentParentEntity без дочерних объектов (на которые есть ссылки в свойствах навигации).Если дочерние объекты существуют, я получаю ошибку «объект с тем же ключом уже существует».Зачем? Как я могу глубоко клонировать как родительскую сущность, так и связанные с ней дочерние сущности, а затем сохранить клонированную запись без каких-либо ошибок?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Для полнойпринятый ответ прочитайте ответ Ладислава Мрнки плюс комментарии .

1 Ответ

2 голосов
/ 14 июля 2011

Если вы действительно использовали сериализацию, вы клонировали родительские и дочерние объекты - это не ваша проблема.Ваша проблема вызывает Detach, потому что он удалит только одну сущность, которую вы отсоединяете (не ее дочерние элементы).Поэтому ошибка вызвана добавлением дочерних элементов с такими же ключами, которые уже отслеживаются контекстом.

...