c# - update - fluentmigrator.net core




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

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

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?


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 годов.


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

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