Introdução às Migrations do Entity Framework

Um dos recursos mais poderosos do Entity Framework é o sistema de migrations (migrações), que ajuda a manter o esquema do banco de dados sincronizado com o modelo de dados da aplicação ao longo do tempo. Neste artigo, vamos explorar o fluxo de desenvolvimento com migrations do Entity Framework, explicando cada etapa e os principais comandos utilizados.

O que são Migrations?

Migrations são uma maneira de aplicar alterações no modelo de dados (definido nas classes C#) para o banco de dados de forma incremental. Elas permitem adicionar, remover ou modificar tabelas e colunas, bem como realizar outras alterações estruturais no banco de dados.

Fluxo de desenvolvimento com migrations

Para entendermos como as migrations funcionam, vamos realizar a criação de um projeto .NET onde vamos implementar desde a criação dos modelos até a geração de scripts SQL. O fluxo típico de desenvolvimento com migrations inclui:

  • Preparando o projeto
  • Adicionar uma Migration
  • Atualizar o Banco de Dados
  • Reverter ou Remover uma Migration
  • Gerar Scripts SQL

Preparando o projeto

Antes de adicionarmos as migrations, precisamos preparar nosso código. Isso inclui a criação de uma entidade, que no nosso exemplo será a entidade “Produto”:

				
					public class Produto
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public decimal Preco { get; set; }
}

				
			

Além disso, precisamos instalar os seguintes pacotes NuGet que serão utilizados para trabalhar com Entity Framework Core:

  • Microsoft.EntityFrameworkCore.Tools: Contém as ferramentas necessárias para gerar e gerenciar as migrations.
  • Microsoft.EntityFrameworkCore.SqlServer: Inclui o provedor do SQL Server para o Entity Framework Core.

Em seguida, é necessário configurar a conexão com o banco de dados e o “DbContext”. Isso pode ser feito no arquivo “Program.cs” ou “Startup.cs”, dependendo da estrutura do seu projeto. A configuração básica do “DbContext” pode ser feita em uma classe que herda o “DbContext”.

Com essas etapas concluídas, estamos prontos para criar e aplicar as migrations no banco de dados.

Adicionar uma migration

Após definir ou modificar seu modelo de dados, precisamos criar uma migration para registrar essas mudanças:

				
					//CLI do .NET:
dotnet ef migrations add CriarTabelaProduto
//Package Manager Console
Add-Migration CriarTabelaProduto

				
			

O comando cria automaticamente uma nova classe de migration que inclui o código necessário para aplicar as mudanças no banco de dados. Vale destacar que o nome da migration (neste caso, CriarTabelaProduto) deve ser único. Se você tentar usar um nome que já foi utilizado, o Entity Framework exibirá um erro. Portanto, escolha nomes descritivos e exclusivos para cada nova migration que você criar.

Código gerado nas migrations

Cada migration gerada inclui dois métodos principais: “Up” e “Down”. Esses métodos são fundamentais para a aplicação e reversão das alterações no banco de dados.

O método “Up” define as operações a serem aplicadas ao banco de dados quando a migration for executada. Este método cria ou modifica o esquema do banco de dados para refletir as alterações no modelo. O método “Up” gerado pela nossa migration será semelhante a esse:

				
					protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.CreateTable(
        name: "produtos",
        columns: table => new
        {
            Id = table.Column<int>(type: "int", nullable: false)
                .Annotation("SqlServer:Identity", "1, 1"),
            Nome = table.Column<string>(type: "nvarchar(max)", nullable: false),
            Preco = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_produtos", x => x.Id);
        });
}

				
			

O método “Down” define como reverter as alterações feitas pelo método “Up”. Este método é usado para desfazer as alterações se você precisar reverter a migration.

				
					 protected override void Down(MigrationBuilder migrationBuilder)
 {
     migrationBuilder.DropTable(
         name: "produtos");
 }

				
			

Atualizar o banco de dados

Depois de adicionar a migration, aplique as mudanças ao banco de dados com o comando “Update-Database”:

				
					//CLI do .NET:
dotnet ef database update
//Package Manager Console:
Update-Database

				
			

Este comando executa o método “Up” da migration, aplicando as alterações ao banco de dados.

Reverter ou remover uma migration

Se você precisar reverter uma migration ou remover uma migration não aplicada, pode usar os seguintes comandos:

				
					//CLI do .NET:
dotnet ef migrations remove
//Package Manager Console:
Remove-Migration
				
			

Agora imagine o seguinte cenário: você começou a configurar seu projeto e criou a primeira migration para gerar a estrutura inicial do banco de dados e a tabela de “Produtos” com fizemos anteriormente. Em seguida, você criou uma segunda migration para adicionar uma tabela chamada “Vendas”. Durante a criaçãovocê criou um erro ao configurar as informações dessa tabela, ou talvez tenha percebido que os dados não estavam corretos. Nesse caso, como a migration “CriarTabelaVendas” já foi aplicada ao banco de dados, você precisa revertê-la antes de corrigir ou remover a migration. Para isso, você pode utilizar o comando a seguir para restaurar o banco de dados ao estado anterior à aplicação da migration CriarTabelaVendas:

				
					//CLI do .NET:
dotnet ef database update CriarTabelaProduto
//Package Manager Console:
Update-Database CriarTabelaProdut

				
			

Esse comando fará o downgrade do banco de dados para o estado em que estava após a primeira migration, chamada “CriarTabelaProduto”. Isso removerá a tabela “Vendas” que foi criada pela migration problemática.

Gerar scripts SQL

Uma funcionalidade importante do Entity Framework Migrations é a capacidade de gerar scripts SQL a partir das migrations. Isso é útil em cenários onde você precisa revisar as mudanças que serão aplicadas ao banco de dados ou deseja executar os comandos SQL manualmente, sem utilizar a aplicação para aplicar as alterações diretamente.

				
					//CLI do .NET:
dotnet ef migrations script
//Package Manager Console:
Script-Migration

				
			

Após executar esses comandos, um script SQL será gerado automaticamente. Este script contém todos os comandos necessários para aplicar as migrations e pode ser revisado ou executado manualmente no banco de dados.

Se você deseja gerar um script a partir de uma migration específica, você pode fazer da seguinte forma:

				
					//CLI do .NET:
dotnet ef migrations script NomeSuaMigration
//Package Manager Console:
Script-Migration NomeSuaMigration

				
			

Outra possibilidade é a de salvar o script que foi gerado em um arquivo “.sql”. Para isso, basta executar o comando:

				
					//CLI do .NET:
dotnet ef migrations script -o caminho/do/arquivo.sql
//Package Manager Console:
Script-Migration -Output caminho/do/arquivo.sql

				
			

Usar scripts SQL em produção

De acordo com as diretrizes da Microsoft, a maneira recomendada para aplicar migrations em ambientes de produção é gerar scripts SQL. Isso oferece maior controle sobre o processo, permitindo que as mudanças sejam revisadas e testadas antes de serem aplicadas ao banco de dados. Além disso, essa abordagem reduz o risco de problemas ao aplicar diretamente as migrations da aplicação.

Acelere a sua carreira conosco!

Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET StartClique aqui

Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET ExpertClique aqui

Conclusão

Em resumo, entender e utilizar as migrations de maneira eficaz proporciona um controle refinado sobre o esquema do banco de dados, facilitando a manutenção e evolução da sua aplicação. A prática com esses comandos e conceitos garantirá uma integração suave entre o modelo de dados e o banco de dados, assegurando que suas alterações sejam aplicadas de maneira segura e confiável.