47

私は流暢な移行ツールを使用してデータベースの移行を管理していますが、私がやりたいのは、アプリの起動時に移行を実行することです。私が管理した最も近いものはこれです:

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で動作させることができましたか?

4

2 に答える 2

63

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がサポートされていることに注意してください。

于 2012-05-09T00:19:34.810 に答える
5

私は実際にapplication_startで移行の実行を完了しましたが、そのコードから何が間違っているのかを判断するのは難しいです...オープンソースなので、コードを取得してソリューションにプルし、ビルドして何が間違っているかを調べます。 Executeメソッドが不平を言っています。FluentMigratorのソースコードはかなりうまく整理されていることがわかりました。

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

于 2011-09-30T15:58:28.513 に答える