Копирование сущностей между несколькими базами данных с помощью NHibernate - PullRequest
12 голосов
/ 31 октября 2008

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

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

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

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

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

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

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

Ответы [ 2 ]

13 голосов
/ 03 ноября 2008

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

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

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

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

0 голосов
/ 02 ноября 2008

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

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

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