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

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

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

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?

4b9b3361

Ответ 1

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.

Ответ 2

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

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