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でうまく機能させることができましたか?
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がサポートされています。
私は実際にapplication_startでの移行の実行を達成しましたが、そのコードから何が問題であるかを判断するのは困難です...オープンソースであるため、コードを取得してソリューションにプルし、ビルドして、 Executeメソッドは不満を持っています。 Fluent Migratorのソースコードはかなりよく整理されていることがわかりました。
これがWebアプリである場合は、移行中にデータベースが使用されないようにする必要があります。接続を確立し、データベースをシングルユーザーモードに設定し、移行を実行し、データベースをマルチユーザーモードに設定して、接続を閉じるという戦略を使用しました。これは、複数のサーバーで負荷分散されたWebアプリケーションのシナリオも処理するため、2つのサーバーが同じデータベースに対して移行を実行することはありません。