Categorias
.Net Core

Executando automaticamente o Migration em uma aplicação .Net Core com MySql

O objetivo desse tutorial é: permitir que uma aplicação .Net Core, conectada a uma base MySql, possa automaticamente executar o Migration no carregamento da aplicação. Isso facilita a atualização da base de dados da aplicação independente do ambiente em que for executada.

Mas lembre-se: use com moderação. É sempre bom possuir um processo de backup antes de qualquer atualização de bases de produção, ainda mais em um processo automatizado.

Começamos com um projeto Asp.NET Core MVC com Identity (o template encontrato no Visual Studio 2019). Com isso já temos um contexto, entidades do Identity e toda a estrutura da aplicação preparada para realizarmos nossos testes e validarmos a solução.

Instalar o pacote pelo PackageConsole utilizando o comando “install-package Pomelo.EntityFrameworkCore.MySql“. Esse será o pacote necessário para todo o processo com o MySql.

No método ConfigureServices (arquivo Startup.cs), alterar a configuração de tipo de banco de dados de “UseSqlServer” para “UseMySql“, ficando dessa forma:

services.AddDbContext<ApplicationDbContext>(options =>
 options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

No arquivo “appSettings.json“, alterar a string de conexão “ConnectionStrings.DefaultConnection” para a string de conexão do MySql (“Server=localhost;Database=db;Uid=user;Pwd=pass;“). Observando que a base no MySql já deve estar criada caso o usuário utilizado na conexão não tenha permissões para tal ação.

A última configuração que faremos está relacionada ao arquivo “Program.cs“. Vamos substituir os 2 métodos da classe (“Main” e “CreateHostBuilder“, considerando o padrão do template do VS2019 com .Net Core 3.x).
O código que será utilizado na substituição é esse:

        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    var context = services.GetRequiredService<ApplicationDbContext>();
 // Ajustar o nome do contexto da aplicação
                    context.Database.Migrate();
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "Erro ao atualizar a base de dados.");
                }
            }

            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Com todas as configurações feitas, bastam apenas mais 2 ações:
Remover o diretório “Migrations” (que fica no diretório “Data”);
E adicionar um novo migration através do PackageConsole: add-migration v1.

O nove da versão “v1” é apenas uma sugestão. Mas o que importa é que agora, a executar a aplicação e se conectar na base MySql, essas configurações permitirão que automaticamente sejam realizadas os migrations pendentes na base de dados.

O mesmo acontecerá quando houverem mudanças futuras no modelo de dados da aplicação (futuras versões v2, v3 etc.).

Bom é só isso. Até a próxima.