Já que configuramos a conexão e geramos o database, vamos prosseguir com a configuração das migrações.

Implementando MigrationRunner

Adicione os pacotes que vão ser utilizados:

dotnet add package FluentMigrator
dotnet add package FluentMigrator.Runner

Primeiro, vamos criar um método de extensão para a migração do database. Em Migrations/, adicione a classe MigrateExtension:

public static class MigrateExtension
{
    public static void MigrateBancoDeDados(this IApplicationBuilder app)
     {
        // Cria um escopo para o serviço de migração
        using var scope = app.ApplicationServices.CreateScope();
 
        // Obtém o serviço de migração
        var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();
        
        // Lista as migrações disponíveis
        runner.ListMigrations();
 
        // Executa todas as migrações disponíveis
        runner.MigrateUp();
    }
}
 

Este método irá executar todas as migrações disponíveis que ainda não foram aplicadas ao banco de dados.

Configurando o serviço

Agora, vamos configurar o FluentMigrator. Para isso, crie o seguinte método na classe Bootstrapper:

private static void AdicionarFluentMigrator(IServiceCollection services, IConfiguration configuration)
{
    services.AddFluentMigratorCore().ConfigureRunner(c => c.AddMySql8()
    .WithGlobalConnectionString(configuration.GetConexaoCompleta())
    .ScanIn(Assembly.Load("SistemaDeEstoque.Infrastructure")).For.All());
}

O código acima:

  • Adiciona o FluentMigratorCore ao serviço de injeção de dependência
  • Configura o FluentMigrator para usar o MySQL 8
  • Usa a string de conexão completa
  • Faz a varredura no assembly “SistemaDeEstoque.Infrastructure” para todas as migrações
  • Aplica todas as migrações encontradas

A classe Bootstrapper é utilizada para adicionar os serviços de cada projeto. Com ela podemos organizar os serviços por projeto e diminuir a quantidade de linhas de código da classe Main

Primeiro, adicione o pacote com o seguinte comando:

dotnet add package Microsoft.AspNetCore.Http.Abstractions;

Dentro da classe, crie um método que extende da interface IServiceCollection e chame a função AdicionarFluentMigrator passando os parâmetros:

public static class Bootstrapper
{
    public static void AdicionarInfrastructure(this IServiceCollection services, IConfiguration configuration)
    {
        AdicionarFluentMigrator(services, configuration);
    }
}

Esses métodos irão adicionar o FluentMigrator ao nosso projeto e configurar o runner para usar o MySQL.

Main

Na classe Program, adicione:

builder.Services.AdicionarInfrastructure(builder.Configuration);

E na função AtualizarBaseDeDados(), chame o método de extensão MigrateBancoDeDados():

void AtualizarBaseDeDados()
{
    var conexao = builder.Configuration.GetConexao();
 
    var nomeDatabase = builder.Configuration.GetNomeDatabase();
 
    Database.CriarDatabase(conexao, nomeDatabase);
 
    // Executa as migrações do banco de dados
    app.MigrateBancoDeDados();
}

O código está pronto para gerar as migrações, na próxima parte iremos criar a primeira versão da migração com uma tabela de exemplo.

FluentMigrator com MySQL para migrações de esquemas mais simples Pt.3