web-dev-qa-db-ja.com

application_startでFluent Migratorを使用することは可能ですか?

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行に到達すると、null参照例外がスローされます。悲しいことに、これについてのドキュメントはなく、私は何年にもわたってそれに頭を悩ませてきました。

誰かがこのようなことをFluentMigratorでうまく機能させることができましたか?

48
ilivewithian

PM>インストールパッケージ 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がサポートされています。

63
Maarten

私は実際にapplication_startでの移行の実行を達成しましたが、そのコードから何が問題であるかを判断するのは困難です...オープンソースであるため、コードを取得してソリューションにプルし、ビルドして、 Executeメソッドは不満を持っています。 Fluent Migratorのソースコードはかなりよく整理されていることがわかりました。

これがWebアプリである場合は、移行中にデータベースが使用されないようにする必要があります。接続を確立し、データベースをシングルユーザーモードに設定し、移行を実行し、データベースをマルチユーザーモードに設定して、接続を閉じるという戦略を使用しました。これは、複数のサーバーで負荷分散されたWebアプリケーションのシナリオも処理するため、2つのサーバーが同じデータベースに対して移行を実行することはありません。

5
Benzilla