Можно ли использовать беглый миграционный процесс в application_start?

Я использую Fluent migrator для управления миграцией базы данных, но я бы хотел, чтобы миграция выполнялась при запуске приложения. Самое близкое, что мне удалось, это:

public static void MigrateToLatest(string connectionString)
{
    using (var announcer = new TextWriterAnnouncer(Console.Out)
                                {
                                    ShowElapsedTime = true,
                                    ShowSql = true
                                })
    {
        var assembly = typeof(Runner).Assembly.GetName().Name;

        var migrationContext = new RunnerContext(announcer)
        {
            Connection = connectionString,
            Database = "SqlServer2008",
            Target = assembly
        };

        var executor = new TaskExecutor(migrationContext);
        executor.Execute();
    }
}

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

Кому-нибудь удалось заставить это работать с FluentMigrator?


person ilivewithian    schedule 27.09.2011    source источник
comment
Я собираюсь записать здесь: Плохая идея. Связать развертывания/миграции с началом вашего приложения? Безумие. Что будет делать приложение, если миграция завершится неудачно? Не начинай?   -  person jcollum    schedule 17.05.2012
comment
@jcollum: может ли приложение запуститься, если оно ожидает перенесенную базу данных? Ошибка при запуске — правильный ответ.   -  person Bryan Boettcher    schedule 17.05.2012
comment
@insta Вряд ли. Вы должны немедленно откатить приложение, миграция которого не удалась. Приложение не должно знать, в какой версии оно находится, оно должно просто запускать ту версию, которая у него есть.   -  person jcollum    schedule 18.05.2012
comment
А для тестирования? Создание пустой базы данных для выполнения интеграционных или приемочных тестов. Это правильный и полезный сценарий.   -  person Bealer    schedule 11.09.2013
comment
Прошло несколько лет, но сейчас я делаю следующее: Сервер сборки запускает миграцию sql (инструменты Redgate), если они терпят неудачу, сборка возвращается, если нет, они продолжают и развертывают программное обеспечение. Это то же самое для qa, live и т. д. Локально команда разработчиков использует систему управления исходным кодом redgate sql. Это оказывается стабильным способом работы.   -  person ilivewithian    schedule 12.09.2013


Ответы (2)


PM> Install-Package FluentMigrator.Tools

Вручную добавьте ссылку на:

packages\FluentMigrator.Tools.1.6.1\tools\AnyCPU\40\FluentMigrator.Runner.dll

Обратите внимание, что имя папки зависит от номера версии, на этом рисунке используется текущая версия 1.6.1. Если вам нужен бегун .NET 3.5, используйте каталог \35\.

public static class Runner
{
    public class MigrationOptions : IMigrationProcessorOptions
    {
        public bool PreviewOnly { get; set; }
        public string ProviderSwitches { get; set; }
        public int Timeout { get; set; }
    }

    public static void MigrateToLatest(string connectionString)
    {
        // var announcer = new NullAnnouncer();
        var announcer = new TextWriterAnnouncer(s => System.Diagnostics.Debug.WriteLine(s));
        var assembly = Assembly.GetExecutingAssembly();

        var migrationContext = new RunnerContext(announcer)
        {
            Namespace = "MyApp.Sql.Migrations"
        };

        var options = new MigrationOptions { PreviewOnly=false, Timeout=60 };
        var factory = 
            new FluentMigrator.Runner.Processors.SqlServer.SqlServer2008ProcessorFactory();

        using (var processor = factory.Create(connectionString, announcer, options))
        { 
            var runner = new MigrationRunner(assembly, migrationContext, processor);
            runner.MigrateUp(true);
        }
    }
}

Обратите внимание, что SqlServer2008ProcessorFactory это настраивается в зависимости от вашей базы данных, есть поддержка: 2000, 2005, 2008, 2012 и 2014.

person Maarten    schedule 09.05.2012
comment
Я получал сообщение об ошибке, что TextWriterAnnouncer не реализует IDisposable, поэтому вы не можете использовать его. Это было в последней версии FluentMigrator. - person Andrew; 01.11.2012
comment
Для всех, кто устанавливает FluentMigrator из NuGet, FluentMigrator.Runner находится в инструментах и ​​не упоминается по умолчанию. - person ashes999; 23.04.2013
comment
FluentMigrator.Runner также входит в состав FluentMigrator. Под пакетами есть каталог инструментов (начиная с версии 1.1.1.0. - person Bealer; 03.07.2013
comment
По состоянию на год назад произошло изменение, в результате которого IDisposable был удален из TextAnnouncer. Вместо этого удалите IMigrationProcessor, если вы получаете ошибки использования файла. - person bpruitt-goddard; 20.09.2013
comment
Возможно ли, что этот подход неправильно настраивает соглашения? Например: имя внешнего ключа - person Bertvan; 19.11.2014
comment
Не забудьте установить пакет FluentMigrator.Tools, это отдельный элемент в Nuget (поскольку пакет по умолчанию имеет только средство запуска x86 и не будет работать с BadImageFormatException в проектах AnyCPU. - person Yury Schkatula; 19.10.2015
comment
У меня есть вопрос, есть ли куча файлов для переноса, и вдруг возникает ошибка во время этого процесса кода (один файл), и я хочу, чтобы в случае какой-либо ошибки он перешел к следующему файлу - person Amit Singh Rawat; 02.02.2018

На самом деле я выполнил миграцию в application_start, однако по этому коду трудно сказать, что может быть не так... Поскольку это открытый исходный код, я просто взял бы код, вставил его в ваше решение и построил его, чтобы выяснить, что Метод выполнения жалуется. Я обнаружил, что исходный код Fluent Migrator довольно хорошо организован.

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

person Benzilla    schedule 30.09.2011
comment
интересный подход к игре с однопользовательским режимом и несколькими для запуска миграции. - person Kat Lim Ruiz; 25.03.2014
comment
В случае сценария веб-приложения с балансировкой нагрузки на нескольких серверах: вы можете создать шаг в осьминоге, который запускает миграции на каждом сервере перед развертыванием. - person Andrey Prokhorov; 07.11.2016