копировать записи из двух баз данных, используя EF - PullRequest
3 голосов
/ 03 августа 2011

Мне нужно скопировать данные из одной базы данных в другую с помощью EF.Например, у меня есть следующие табличные отношения: Forms-> FormVersions-> FormLayouts ... У нас есть разные формы в обеих базах данных, и мы хотим собрать их в одну БД.По сути, я хочу рекурсивно загрузить объект Form из одной БД и сохранить его в другой БД со всеми его ссылками.Также мне нужно изменить идентификаторы объекта и связанных объектов, если во второй базе данных существуют объекты с одинаковым идентификатором.

До сих пор у меня был следующий код:

Form form = null;
using (var context = new FormEntities())
        {
            form = (from f in context.Forms
                        join fv in context.FormVersions on f.ID equals fv.FormID
                        where f.ID == 56
                        select f).First();
        }

        var context1 = new FormEntities("name=FormEntities1");
        context1.AddObject("Forms", form);
        context1.SaveChanges();

Я получаю сообщение об ошибке: «Свойство EntityKey может быть установлено, только если текущее значение свойства равно нулю.»

Можете ли вы помочь с реализацией?

Ответы [ 3 ]

4 голосов
/ 03 августа 2011

Самое простое решение - создать копию вашей Формы (новый объект) и добавить этот новый объект. В противном случае вы можете попробовать:

  1. Звоните context.Detach(form)
  2. Установить EntityKey формы равным нулю
  3. Звоните context1.AddObject(form)
3 голосов
/ 03 августа 2011

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

http://msdn.microsoft.com/en-us/library/bb738708.aspx

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

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

Мой опыт работы с этой средой связан с RIA Services и Silverlight, однако я считаю, что эти операции также поддерживаются в .Net.

http://riaservicescontrib.codeplex.com/wikipage?title=EntityGraphs

Edit1: я только что проверил документы EntityGraph и вижу, что DetachEntityGraph находится в специальном слое RIA, который, к сожалению, исключает его как вариант для вас.

Edit2: ответ Алекс Джейм на следующий вопрос является решением вашей проблемы. Не загружайте объекты в контекст для начала - используйте опцию notracking. Таким образом, вам не нужно отсоединять их, что является причиной проблемы.

Entity Framework - Отключение и сохранение графа связанных объектов

1 голос
/ 03 августа 2011

Если вы делаете только несколько записей, совет Ладислава, вероятно, сработает, но если вы перемещаете много данных, вы должны / могли бы рассмотреть возможность сделать это в хранимой процедуре. Вся операция может быть выполнена на сервере, без необходимости перемещать объекты с сервера базы данных на внешний интерфейс, а затем обратно. Один вызов SP сделает все это.

Производительность будет намного лучше, что может иметь или не иметь значения в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...