Консольное приложение C# FluentMigrator.Runner устанавливает транзакцию за сеанс
Я использую FlunetMigrator.Runner.3.2.1 и вижу, что в этой версии по умолчанию больше не выполняется откат всех миграций, если одна из них не работает. Он говорит, что они относятся к файлу миграции! что не добавляет ценности. Есть ли способ установить транзакцию для каждого сеанса при ее запуске как консольном приложении.net core.
Я вижу, что есть ссылка https://fluentmigrator.github.io/articles/runners/runner-console.html, но в ней говорится, что используйте файл Migrate.exe, который мы не используем, мы используем консоль. Могу ли я установить в коде уровень транзакции как сессию?
Зачем кому-то запускать его и вносить только некоторые изменения, все или ничего - гораздо лучший подход
1 ответ
Я нашел ответ! вы устанавливаете int в параметрах Runner, как показано ниже
opt.TransactionPerSession = true;
Полный метод, создающий IServiceProvide
private static IServiceProvider CreateServices(string connectionString,
CommandLineArguments commandLineArguments)
{
return new ServiceCollection()
// Add common FluentMigrator services
.AddFluentMigratorCore()
.ConfigureRunner(rb => rb
// Add SQL Server support to FluentMigrator
.AddSqlServer()
// Set the connection string
.WithGlobalConnectionString(connectionString)
// Define the assembly containing the migrations
.ScanIn(typeof(Program).Assembly).For.Migrations().For.EmbeddedResources())
// Enable logging to console in the FluentMigrator way
.AddLogging(lb => lb.AddFluentMigratorConsole())
.Configure<RunnerOptions>(opt => {
opt.Tags = commandLineArguments.Tags.ToArray();
opt.TransactionPerSession = true; })
// Build the service provider
.BuildServiceProvider(false);
}
Приведенный ниже код - это полный пример, в котором используется IServiceProvider.
var serviceProvider = CreateServices(connectionString, commandLineArguments);
// Put the database update into a scope to ensure
// that all resources will be disposed.
using (var scope = serviceProvider.CreateScope())
{
try
{
UpdateDatabase(scope.ServiceProvider, commandLineArguments);
}
catch (Exception e)
{
Console.WriteLine("There was a problem with the migration: " + e.Message + "\n" +
e.StackTrace);
}
migrationRun = true;
}
Код обновления базы данных:
private static void UpdateDatabase(IServiceProvider serviceProvider, CommandLineArguments commandLineArguments)
{
// Instantiate the runner
var runner = serviceProvider.GetRequiredService<IMigrationRunner>();
if (commandLineArguments.Downgrade)
{
runner.MigrateDown(commandLineArguments.Version != -1 ? commandLineArguments.Version : 0);
}
else
{
if (commandLineArguments.Version != -1)
{
runner.MigrateUp(commandLineArguments.Version);
}
else
{
runner.MigrateUp();
}
}
}