Использование FluentMigrator с существующей базой данных

Я ищу фреймворк миграции, который будет работать с существующим проектом, который использует .NetTiers, более старую ORM, которая требует CodeSmith для генерации кода доступа к данным.

У нас есть некоторый опыт работы с разворотом, и мы успешно его применяем. Мы также можем автоматически развертывать изменения схемы при запуске развертываний из Octopus Deploy. Довольно просто, поскольку это просто набор сценариев SQL.

Я был заинтересован в переходе на FluentMigrator. Мне нравится FM DSL, и я нашел этот вопрос SO весьма полезным, однако есть несколько вещи, которые я не грок:

  1. Как правильно импортировать существующую схему базы данных [*]?
  2. Как правильно развертывать миграции в производственной среде [**]?

[*] Я предполагаю, что я создаю один сценарий с помощью инструментов SQL Server и использую ExecuteEmbeddedSql в качестве начальной миграции. Это правильно?

[**] Существует три основных способа запуска миграции (командная строка, средство запуска NAnt, средство запуска MSBuild). Им потребуется доступ к базе данных, чтобы они могли работать. Представьте, что мы хотим развернуть это в среде PROD. У разработчиков и сервера сборки нет доступа к этой среде. Как вы справляетесь с этими бегунами в этой среде?

Наш обычный процесс развертывания заключается в создании коллекции сценариев SQL, которые необходимо развернуть как часть развертывания. Операции запускают их как часть развертывания, либо автоматически как часть процесса развертывания Octopus (PowerShell), либо запускаются вручную, если развертывание выполняется за пределами Octopus).

Одна из проблем, с которыми мы сталкиваемся в этом конкретном проекте, - это .NetTiers. Это означает, что мы должны запустить генерацию кода CodeSmith с использованием .NetTiers для создания уровня доступа к данным, прежде чем мы сможем кодировать эти сущности и службы данных. Следовательно, наш рабочий процесс должен быть следующим:

  1. Запись миграции
  2. Запустите миграцию для обновления базы данных (выберите конкретную базу данных .NetTiers)
  3. Запустите .NetTiers для конкретной базы данных .NetTiers (центральный сервер сборки)
  4. Код для новых созданных .NetTiers сущностей, полей базы данных и т. Д.

Я бы хотел сбросить .NetTiers, но, к сожалению, рефакторинг в настоящее время не является жизнеспособным вариантом.


person Rebecca    schedule 06.03.2014    source источник


Ответы (1)


Я наконец решил это. Большинство моих проблем было связано с непониманием FluentMigrator. Я буду выбирать свои первоначальные вопросы один за другим.

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

Я не мог найти «правильный путь», но я мог найти способ, который работал для меня! Я принял следующие основные решения:

  1. Я написал сценарий для всей базы данных в качестве базового уровня. Я включил все таблицы, процессы, ограничения, представления, индексы и т. Д. Я установил свою первую итерацию в качестве базовой. Я выбрал вариант CREATE без DROP. Это будет моя миграция.
  2. Я запустил тот же дамп сценария, но выбрал только DROP. Это будет моя миграция вниз.

Базовая миграция просто должна использовать метод EmbeddedScript для выполнения прикрепленного скрипта (я также организовываю скрипты в итерационные папки).

[Tags(Environments.DEV, Environments.TIERS, Environments.CI, Environments.TEST)]
[Migration(201403061552)]
public class Baseline : Migration
{
    public override void Up()
    {
        this.Execute.EmbeddedScript("BaselineUp.sql");
    }

    public override void Down()
    {
        this.Execute.EmbeddedScript("BaselineDown.sql");
    }
}

Базовый уровень решен ...

Что делать с .NetTiers

Хорошо, это было своего рода проблемой. Я создал специальную базу данных .NetTiers, которую я бы использовал для запуска генерации кода .NetTiers. В FluentMigrator вы можете пометить миграции. Я решил пометить в зависимости от окружения. Следовательно, у меня есть тег «tiers», а также теги для «dev», «test», «uat», «prod» и т. Д. Как они запускаются, мы расскажем позже.

При внесении изменений в схему я создаю миграцию и использую тег «tiers», чтобы сосредоточиться на изменении схемы .NetTiers. Затем я запускаю migrate.exe из Внешние инструменты Visual Studio используя этот конкретный тег в качестве флага. Соединение с базой данных app.config, которое соответствует имени моего компьютера, будет используемым соединением с базой данных, поэтому я указываю его на базу данных уровней. Теперь моя миграция завершилась, моя исходная база данных .NetTiers готова. Теперь я могу запустить инструмент генерации кода .NetTiers Codesmith для создания новых библиотек DLL.

.NetTiers решено ...

Как правильно развертывать миграции в производственной среде?

Я использую Octopus Deploy и, честно говоря, если вы развертываете приложения .NET, особенно на нескольких серверах, это должен быть ваш идеальный инструмент для этого!

Я не буду вдаваться в подробности развертывания Octopus, но на базовом уровне вы можете подключить TeamCity и Octopus к развертыванию вместе. OD предоставит вам два предмета для начала.

  1. Программа под названием Octopack, которая превращает ваше приложение в пакет NuGet.
  2. Плагин TeamCity, который заставляет TeamCity создавать пакет NuGet и предлагать его в качестве артефакта, отображаемого в канале NuGet.

Затем Octopus Deploy использует этот канал NuGet и может развертывать эти пакеты на серверах конечных точек. Частью этого процесса развертывания является выполнение сценариев PreDeploy и PostDeploy Powershell. Здесь я собираюсь запустить приложение migrate.exe с моими конкретными тегами.

Развертывание решено ...

person Rebecca    schedule 18.08.2014
comment
Файл .sql должен иметь действие сборки: Embedded Resource - person Morten Holmgaard; 06.10.2015
comment
@MortenHolmgaard правильно, извините, я это пропустил. - person Rebecca; 07.10.2015
comment
Я столкнулся с той же проблемой, когда мы начали использовать FluentMigrator в уже зрелой базе данных. У нас также была некоторая совокупность исходных данных, поэтому я использовал продукты RedGates для создания сценариев как для схемы, так и для данных. - person Arne H. Bitubekk; 09.12.2016
comment
Как использовать для существующих таблиц / процессов и т. Д ... Допустим, я упаковываю все свои запросы для таблиц / процедур в sql. Я запускаю свою первую миграцию. MigrationUp выдает ошибку, говоря, что элемент уже существует. Как из этого выбраться? Я могу взломать, добавив первую миграцию в таблицу версий, говоря, что она уже сделана? Будет ли это правильным способом? - person Sriman Saswat Suvankar; 02.11.2018
comment
@SrimanSaswatSuvankar Вы нашли какое-нибудь решение проблемы, с которой столкнулись? - person dK-; 16.09.2019
comment
@ dK - Я не могу вставить сюда снимок экрана, но если вы посмотрите на модальные расширенные параметры в MSSMS for Tasks - ›Generate Scripts, то в разделе General есть опция Проверить наличие объекта. - person Rebecca; 20.01.2020