Свободно ли играют Fluent NHibernate и migratordotnet вместе?
Я люблю Fluent NHibernate за создание своих БД и до сих пор не нашел ограничения, которое остановило меня в моих треках.
Однако в моем текущем проекте я рассчитываю начать производство очень рано в жизненном цикле продукта и, следовательно, ожидаю, что по мере нашего развития в схеме БД будет много небольших изменений.
Я хотел бы отслеживать эти изменения DDL и DML в "миграциях", используя такой инструмент, как migratordotnet. Но мой вопрос: возможно ли заставить эти два инструмента (или аналогичные инструменты) работать вместе?
В духе СУХОГО, как я могу получить изменения моей схемы из моих отображений в Fluent Nhibernate? Это возможно?
Или лучший подход - оставить генерацию схемы для инструмента, такого как migratordotnet, и оставить Fluent NHibernate только с ответственностью за сопоставление? Хм, это похоже на лучшее разделение проблем на уровне инструмента.
Ура!
4 ответа
Гордон,
У меня был тот же вопрос по предыдущим проектам, и мы решили использовать migratordotnet исключительно для миграции наших баз данных и просто пропустили SchemaUpdate в целом.
Я все еще буду использовать SchemaUpdate для быстрых прототипов, но как только я начну проект всерьез, я использую только migratordotnet.
С настройками миграции, которые запускаются как часть наших ночных сборок, migratordotnet работает очень хорошо, если над проектом работает более одного человека.
Я также сталкиваюсь с той же самой проблемой, где я не хочу поддерживать миграцию (используя migratordotnet) и мои файлы сопоставления независимо. Единственная полезная вещь, которую я нашел до сих пор, - это SchemaUpdate от NHibernate, но она не обрабатывает удаление столбцов или таблиц. Для этих типов изменений вам все равно придется написать миграцию вручную. Прямо сейчас я склоняюсь к использованию migratordotnet исключительно для изменений базы данных вместо того, чтобы смешивать SchemaUpdate, генерировать DDL и миграции. Это все еще кажется подверженным ошибкам, так как вы могли бы неправильно преобразовать изменения уровня отображения / домена в миграции.
Я сталкиваюсь с той же проблемой. Вот мой текущий рабочий процесс, который избегает SchemaUpdate:
- создать базу данных с нуля (если будут внесены какие-либо изменения)
- хранить все справочные данные в таблицах
- перезагрузите все данные через специальный проект командной строки 'dataloader'
Этот рабочий процесс хорош для разработки, так как пересборка и заполнение БД с нуля каждый раз решает проблему управления версиями базы данных. Это также обеспечивает хорошую основу для тестирования вашей БД и фактических данных, которые вы вставляете.
Очевидно, что это не сработает в производственном процессе после запуска работающей базы данных, которую нельзя отбросить и перестроить произвольно. Это то, что я делаю:
- Когда цикл разработки закончен, я беру клон производственной базы данных. База данных Prod доступна только для чтения на время обновления (хорошо для моего приложения... не уверен насчет более критичных по времени приложений)
- Используйте SQL Compare для переноса изменений и данных из dev в базу данных prod
- нажмите это, чтобы проверить.
- Если тест пройден, нажмите на производство.
Это не идеально и использует коммерческий продукт SQL Compare. Это работает для меня, но я хотел бы услышать некоторые лучшие идеи.
Да - в основном. Я успешно использую как FNH, так и migratordotnet для толстого настольного клиента, и это работает довольно хорошо. Я должен был изменить это для двух вещей:
Чтобы разрешить внедрение SQL-соединения в TransformationProvider (или, точнее, в SQLiteTransformationProvider)
вырвать ссылки на другие не-sqlite TransformationProviders, так как, когда я пытался упаковать его с моим приложением, это приводило к различным ошибкам из-за невозможности найти Oracle, Postgres и т. д.
Это специфично для sqlite - взломайте его, чтобы лучше разобрать sqlite и создать операторы таблиц. К сожалению, он не может обработать операторы создания таблицы в форме
CREATE TABLE FOO(id INT, ..., primary key(id))
(в отличие отCREATE TABLE FOO(id INT PRIMARY KEY, ...)
который он обрабатывает). Объедините это с тем, как он выполняет удаление столбцов (создайте новый столбец без таблицы, перенесите данные поверх, удалите исходный и переименуйте новый в исходный), это означает, что вы можете получить довольно неприятное поведение, такое как удаление столбца в таблице, делающее ваш столбец первичного ключа столбец без первичного ключа.