我正在使用流畅的迁移器来管理我的数据库迁移,但我想要做的是让迁移在app start运行。我所管理的最接近的是:
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合作?
答案 0 :(得分:63)
PM>安装包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
这是可配置的,具体取决于您的数据库,支持:2000,2005,2008,2012和2014.
答案 1 :(得分:5)
我实际上已经完成了在application_start中运行迁移,但很难从代码中判断出什么是错误的......因为它是开源的,我只需抓住代码并将其拉入您的解决方案并构建它以查找了解Execute方法所抱怨的内容。我发现Fluent Migrator的源代码组织得很好。
如果这是一个Web应用程序,您可能需要关注的一件事是确保在迁移时没有人使用数据库。我使用了建立连接,将数据库设置为单用户模式,运行迁移,将数据库设置为多用户模式,然后关闭连接的策略。这还处理多个服务器上的负载平衡Web应用程序的场景,因此2台服务器不会尝试针对同一数据库运行迁移。