有没有可能在application_start中使用stream利的迁移?

我使用stream利的迁移pipe理我的数据库迁移,但我想要做的是在应用程序启动时运行迁移。 我最近pipe理的是这样的:

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(); } } 

我确定我有这个工作,但是我没有看到它(业余爱好项目),它现在抛出空引用exception,当它到达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 Runner,请使用\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可以根据您的数据库进行configuration,支持:2000,2005,2008,2012和2014。

我实际上已经在application_start中完成了运行迁移,但是很难从代码中判断出什么可能是错误的…因为它是开源的,我只需要抓住代码并将其引入到您的解决scheme中,然后构build它以查明执行方法正在抱怨。 我发现Fluent Migrator的源代码组织得很好。

有一件事你可能不得不担心,如果这是一个Web应用程序,确保在迁移时没有人使用数据库。 我使用了build立连接的策略,将数据库设置为单用户模式,运行迁移,将数据库设置为多用户模式,然后closures连接。 这也处理了多个服务器上负载平衡Web应用程序的情况,所以2台服务器不会尝试针对同一个数据库运行迁移。