Можно ли использовать беглый мигратор в application_start? - PullRequest
48 голосов
/ 27 сентября 2011

Я использую 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?

Ответы [ 2 ]

63 голосов
/ 09 мая 2012

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.

5 голосов
/ 30 сентября 2011

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

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

...