Как избежать конфликтов с существующими идентификаторами сущностей при десериализации и импорте сущностей EF? - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть веб-приложение ASP.NET 4, которое использует Entity Framework для хранения, среди прочего, иерархической структуры элементов, которая используется для таких функций, как навигация.

Одна из функций приложения позволяет экспортировать определенную ветвь дерева иерархии в XML, сгенерированный с использованием DataContractSerializer. После экспорта предполагается, что XML можно затем загрузить в другой экземпляр того же приложения, десериализовать обратно в объекты EF, а затем добавить в модель данных на втором сервере.

Когда я пытаюсь импортировать данные таким образом, я обнаруживаю следующую ошибку:

Невозможно добавить или присоединить объект, поскольку его EntityReference имеет значение свойства EntityKey, которое не соответствует EntityKey для этого объекта.

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

В идеале я бы хотел иметь возможность (если я что-то здесь упускаю) - присоединить импортированные объекты к контексту объекта и сбросить идентификаторы импортируемых объектов.

Есть ли умный способ сделать это? Должен ли я просто установить идентификатор для каждого из импортированных объектов в 0, присоединить их к контексту объекта и затем сохранить изменения?

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

1 Ответ

2 голосов
/ 14 февраля 2011

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

  • Установите для свойства удостоверения значение 0.
  • Установите для свойства EntityKey значение null.
  • Для каждого свойствадля сущности, полученной из EntityReference, установите для EntityKey для этой ссылки значение null.

Затем я добавил корневой узел в иерархию, которую я импортировал в контекст моего объекта, используя AddObject и вызвал SaveChanges.

...