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.
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.
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:
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:
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.
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.
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");
}
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.
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.
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
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.
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
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.