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(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Nome = table.Column(type: "nvarchar(max)", nullable: false),
Preco = table.Column(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 Start: Clique 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 Expert: Clique 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.