Подтвердить что ты не робот

Копирование объектов между несколькими базами данных с помощью NHibernate

У меня есть приложение для рабочего стола (winforms), которое использует базу данных Firebird в качестве хранилища данных (во встроенном режиме), и я использую NHibernate для ORM. Одной из функций, которые нам необходимо поддерживать, является возможность импорта/экспорта групп данных в/из внешнего файла. В настоящее время этот внешний файл также представляет собой базу данных с той же схемой, что и основная база данных.

У меня уже установлен NHibernate для просмотра нескольких баз данных, и я могу работать с двумя базами данных одновременно. Проблема, однако, заключается в копировании данных между двумя базами данных. У меня есть две стратегии копирования: (1) копировать все одинаковые идентификаторы для объектов [aka import/export] и (2) копировать в основном новые идентификаторы [aka duplicate/copy]. Я говорю "в основном новый", потому что есть некоторые элементы поиска, которые всегда будут скопированы с тем же идентификатором.

Копирование всего с новыми идентификаторами в порядке, потому что у меня просто будет метод "CopyForExport", который может создавать копии всего и не назначать новые идентификаторы (или уничтожать все идентификаторы в дереве объектов).

Каков способ "наилучшей практики" справиться с этой ситуацией и скопировать данные между базами данных при сохранении одинаковых идентификаторов?

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

Дальнейшее разъяснение: я думаю, что я выделил проблему: Я хочу использовать функцию ISession.SaveOrUpdate для NHibernate, поэтому я настроил свои объекты с генератором идентификаторов, который не "назначен". Однако у меня проблема, когда я хочу переопределить сгенерированное удостоверение (для копирования данных между несколькими базами данных в одном процессе).

Есть ли способ использовать генератор Guid.Comb или UUID, но иногда можно указать свой собственный идентификатор (для передачи другому соединению базы данных с той же схемой).

4b9b3361

Ответ 1

Я нашел ответ на свой вопрос: Ключ - это метод ISession.Replicate. Это позволяет копировать графики объектов между хранилищами данных и сохранять один и тот же идентификатор. Чтобы создать новые идентификаторы, я думаю, что могу использовать ISession.Merge, но мне все равно нужно это проверить.

Однако есть несколько предостережений: у моего тестового класса есть ссылка на родительский объект (отношения "много-к-одному" ), и мне пришлось сделать класс не-ленивой загрузкой, чтобы заставить Replicate работать правильно. Если бы у меня не было настроенной загрузки (без ленивой загрузки, я думаю), она будет реплицировать объект, а не родительский объект (cascade = "all" в моем файле hbm.xml).

В документах Java Hibernate есть ссылка на Replicate(), но в документации по NHibernate нет (раздел 10.9 в java-документах).

Это имеет смысл для поведения Replicate, потому что мы хотим иметь полностью гидратированные объекты, прежде чем передавать их в другое хранилище данных. Что странно, так это то, что даже при открытии обоих сеансов (по одному для каждого хранилища данных) он не думал увлажнять объект, когда я хотел его воспроизвести.

Ответ 2

Вы можете использовать FBCopy для этого. Просто определите, какие таблицы и столбцы вы хотите скопировать, и я сделаю это. Вы также можете добавить необязательное предложение WHERE для каждой таблицы, поэтому оно копирует только нужные строки.

При копировании он гарантирует, что порядок экспорта данных сохраняется, так что внешние ключи не прерываются. Он также поддерживает генераторы.