Консольное приложение 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();
        }

    }
}
Другие вопросы по тегам