Можно ли использовать плавный мигратор в application_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?
Ответы
Ответ 1
PM > Install-Package 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.
Ответ 2
Я действительно выполнил запущенные миграции в application_start, однако из этого кода сложно сказать, что может быть неправильным... Поскольку это открытый исходный код, я бы просто захватил код и втянул его в ваше решение и построил его, чтобы найти из чего жалуется метод Execute. Я обнаружил, что исходный код для Fluent Migrator организован довольно хорошо.
Одна вещь, о которой вам, возможно, придется беспокоиться, если это веб-приложение, заключается в том, что никто не использует базу данных во время миграции. Я использовал стратегию установления соединения, установки базы данных в однопользовательский режим, выполнения миграции, установки базы данных в многопользовательский режим, а затем закрытия соединения. Это также обрабатывает сценарий сбалансированного по нагрузке веб-приложения на нескольких серверах, поэтому 2 сервера не пытаются запускать миграции с одной и той же базой данных.