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.

Categorias
.Net Core

Habilitar o auto migration no carregamento de uma aplicação .Net Core

O Migration existente no .Net FullFramework possui alguns recursos que até no momento desse post não estão presentes no .Net Core.

Um desses recursos é o auto migration, que facilita e automatiza a atualização da base de dados em produção. Claro, isso deve seguir alguns procedimento de homologação antes e um processo de rollback em caso de falhas (o que poderia ocorrer com uma atualização manual).

Para habilitar o auto migration no .Net Core serão necessários poucas linhas de código. Isso vai garantir a aplicação automática das mudanças no banco de dados assim que a aplicação for carregada.

Vamos considerar uma aplicação MVC Core, iniciada do zero, apenas ativando a autenticação individual para que já tenhamos a estrutura básica da aplicação web e um contexto pré-configurado.

Serão necessárias apenas algumas configurações no arquivo appsettings.json para que sejam configurados os dados de acesso ao banco de dados.

Começamos alterando o arquivo Program.cs, importando os seguintes namespaces (apenas ajustando o nome do contexto):

using Microsoft.Extensions.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore;

Continuamos alterando os métodos padrão para o seguinte código:

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();
    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<NOME_DO_CONTEXTO_DA_APLICACAO>();
            context.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "Erro ao atualizar banco.");
        }
    }

    host.Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

Com isso, basta realizar as alterações e criação de novas entidades, executar o comando Add-Migration e ao executar a aplicação verá que a atualização ocorrerá automaticamente.

Até a próxima.