Aprenda a Criar e Publicar Pacotes NuGet Profissionais
Migrations e EF Core: Evolua seu Banco com Segurança
Imagine que você tem uma aplicação em produção e precisa adicionar📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. uma nova coluna à tabela de usuários para armazenar um campo extra de informação. Você não quer perder nenhum registro e também não quer fazer todo o processo manualmente em SQL. É aí que as migrations entram em cena! Elas permitem que você evolua seu banco de dados de forma organizada e segura, sem ficar refém de processos manuais e dores de cabeça.
Neste artigo, vamos explorar como as migrations funcionam na prática, por que são tão importantes, e como aplicá-las sem ameaçar seus dados. Além disso, vamos desvendar como o Entity Framework Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. utiliza essa ferramenta para permitir a evolução do banco de dados sem apagar dados preciosos, como se você estivesse reformando sua casa sem precisar jogar fora os móveis.
- [O que São Migrations e Por que Usar?](#o-que-são-migrations-e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.-por-que-usar)
- [O Problema que as Migrations Resolvem](#o-problema
🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes.-que-as-migrations-resolvem)
- [Como Funciona o Processo de Migrations](#como-funciona-o-processo-de-migrations)
- [Como o EF Core
🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. Gerencia as Migrations?](#como-o-ef-core-gerencia-as-migrations)
- [Criando e Aplicando Migrations Passo a Passo](#criando-e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.-aplicando-migrations-passo-a-passo)
- [Evoluindo o Banco sem Perder Dados](#evoluindo-o-banco-sem-perder-dados)
- [Modificações Incrementais](#modificações-incrementais)
- [Rollback de Migrations](#rollback-de-migrations)
- [Migrações em Produção](#migrações-em-produção)
- [Boas Práticas
🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. e Dicas Úteis](#boas-práticas-e-dicas-úteis)
- [Desafio Prático](#desafio-prático)
- [Erros Comuns
🔏 Criptografia Assimétrica: Domine RSA e Troca de Chaves!Descubra como a criptografia assimétrica protege a troca de chaves e garante segurança em sistemas digitais usando RSA, C# e práticas recomendadas. (e Como Evitá-los)](#erros-comuns-e-como-evitá-los)
- [Conclusão](#conclusão)
O que São Migrations e Por que Usar?🔗
- Migration (ou migração) é o processo de manter o esquema do banco de dados sincronizado com o modelo de entidades que seu código utiliza. Em vez de editar tabelas manualmente, você gera scripts
🎭 Scripts em C#: Controle Personagens e Física!Aprenda a desenvolver scripts em C# para personagens e integrar física realista em Unity. Um guia passo a passo para iniciantes e devs em transição. e automatiza a evolução do banco.
- Controle de Versão
🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. no Banco: Migrations são como um “Git para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! o seu banco”, facilitando testes, rollback e auditorias.
- Menos Erros
🎲 Desafio: Crie um Sistema de Login com Tratamento de Erros Robusto!Aprenda a criar um sistema de login robusto em C#, com tratamento de erros adequado, validação e segurança para evitar vulnerabilidades. Manuais: Nada de esquecer uma coluna ou tipo
🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. de dado. O gerador de migrações detecta mudanças na modelagem e cria arquivos prontos para serem executados.
- Facilidade de Implantação: Em ambientes de produção, basta rodar o passo de aplicação das migrações. Tudo é sistematizado.
O Problema que as Migrations Resolvem🔗
Antes das Migrations, alterar esquemas de banco era como dirigir sem airbag:
- Scripts
🎭 Scripts em C#: Controle Personagens e Física!Aprenda a desenvolver scripts em C# para personagens e integrar física realista em Unity. Um guia passo a passo para iniciantes e devs em transição. SQL manuais propensos a erros
- Dificuldade em manter consistência entre ambientes
- Risco de perda de dados em alterações complexas
- Versionamento
🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. caótico das mudanças
Exemplo real: Adicionar📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. uma coluna
DataNascimento
na tabela Clientes
sem dropar a tabela.
Como Funciona o Processo de Migrations🔗
A lógica básica envolve três etapas:
1. Detecção de Mudanças: Quando você altera sua modelagem (por exemplo, adiciona uma propriedade⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. em uma classe), a ferramenta de migração detecta a diferença em relação ao banco atual.
2. Criação da Migration: A ferramenta gera um arquivo (ou classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara.) de migração com instruções Up e
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Down.
- Up: o que será feito no banco para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! refletir as mudanças.
- Down: o que fazer para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! reverter caso seja necessário.
3. Aplicação da Migration: Você executa o comando🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. para efetivamente alterar o banco.
O nome e a forma de cada comando🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. podem variar um pouco dependendo do seu ambiente, mas a essência é sempre a mesma.
Como o EF Core Gerencia as Migrations?🔗
O Entity Framework Core🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. utiliza um snapshot do modelo
🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto. atual para comparar com o banco de dados e gerar as migrações necessárias.
// Snapshot do modelo atual
modelBuilder.Entity("Cliente", b =>
{
b.Property<int>("Id");
b.Property<string>("Nome");
// ...
});
1. Snapshot do Modelo🎭 MVVM: Separe Regras de Negócio da Interface Graficamente!Descubra como o padrão MVVM separa a interface e a lógica de negócio, facilitando testes e manutenção, com exemplos e dicas práticas para seu projeto.: Foto do estado atual das entidades.
2. Geração de Migrations: Compara snapshots para criar scripts🎭 Scripts em C#: Controle Personagens e Física!Aprenda a desenvolver scripts em C# para personagens e integrar física realista em Unity. Um guia passo a passo para iniciantes e devs em transição. SQL.
3. Versionamento🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes.: Cada migration é um arquivo.cs com
Up()
e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades.
Down()
.
Criando e Aplicando Migrations Passo a Passo🔗
A seguir, um fluxo bem resumido de como isso pode ocorrer no dia a dia:
# 1. Detectar mudanças e criar uma nova migration:
dotnet ef migrations add AdicionaColunaTelefone --context MeuDbContext
# 2. Aplicar a migração no banco de dados:
dotnet ef database update --context MeuDbContext
- No passo 1, estamos criando a migration
AdicionaColunaTelefone
, que vai refletir a adição🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. de uma nova coluna.
- No passo 2, o comando
🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. efetiva as alterações no banco.
Se, por algum motivo, você quiser desfazer a última migração (por exemplo, antes de aplicar em produção), existe a possibilidade de rodar algo como dotnet ef migrations remove
. Isso remove📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos.
📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. o arquivo de migração criado, caso ele ainda não tenha sido aplicado no banco.
Evoluindo o Banco sem Perder Dados🔗
A grande preocupação ao modificar o esquema é não perder dados existentes. Algumas dicas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. para isso:
- Adicione Novas Colunas como NULLable: Se você precisa de uma nova coluna, pode criá-la permitindo valores
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. nulos caso não saiba o que colocar nos registros antigos.
- Defina Valores
🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. Default: Se a coluna precisa de um valor
🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança., definir um default evita falhas na atualização.
- Evite Drop de Colunas sem Prevenir: Sempre faça backup ou garanta que as informações não serão mais necessárias antes de remover
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. alguma coluna.
- Considere Scripts
🎭 Scripts em C#: Controle Personagens e Física!Aprenda a desenvolver scripts em C# para personagens e integrar física realista em Unity. Um guia passo a passo para iniciantes e devs em transição. de Migração Personalizados: Quando
📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. precisar transferir dados de uma coluna para outra, você pode escrever lógica customizada na seção Up da migration para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! não perder dados na transição.
Exemplo de um trecho que atualiza dados durante uma migração (trecho Up):
using Microsoft.EntityFrameworkCore.Migrations;
public partial class AdicionaPhoneComValorDefault : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
// Adiciona a coluna Phone com valor default
migrationBuilder.AddColumn<string>(
name: "Phone",
table: "Usuarios",
nullable: true
);
// Exemplo: Preencha com um valor padrão (se necessário)
migrationBuilder.Sql("UPDATE Usuarios SET Phone = 'N/A' WHERE Phone IS NULL");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
// Remove a coluna caso seja preciso um rollback
migrationBuilder.DropColumn(name: "Phone", table: "Usuarios");
}
}
Esse tipo🧠 Variáveis em C#: Onde os Dados Ganham Vida (e Nome!)Descubra como as variáveis em C# funcionam, com exemplos do mundo real, boas práticas de nomeação e dicas para otimizar seu código. de abordagem permite deixar a migração “inteligente” o bastante para lidar com dados pré-existentes.
Modificações Incrementais🔗
Cenário: Adicionar📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. email ao Cliente
public class Cliente
{
public int Id { get; set; }
public string Nome { get; set; }
public string Email { get; set; } // Nova propriedade
}
dotnet ef migrations add AdicionaEmailCliente
dotnet ef database update
Migration gerada:
migrationBuilder.AddColumn<string>(
name: "Email",
table: "Clientes",
nullable: true);
Rollback de Migrations🔗
dotnet ef database update Inicial # Volta para a versão Inicial
dotnet ef migrations remove # Remove a última migration não aplicada
Importante: Rollbacks🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade. em produção requerem backup! Dados podem ser afetados.
Migrações em Produção🔗
Estratégias seguras:
dotnet ef migrations script --output migration.sql # Gera script para DBA aprovar
Ferramentas complementares:
- DbUp (para
🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! controle mais granular)
- CI/CD pipelines
📊 Pipelines: Pré-processe Dados como um Cientista!Aprenda a criar pipelines eficientes com ML.NET, automatizando o pré-processamento de dados e garantindo modelos de Machine Learning precisos e reprodutíveis. com etapas de migração
- Azure DevOps Deployment
🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade. Gates
Boas Práticas e Dicas Úteis🔗
1. Uma Mudança por Migração: Evite englobar diversas alterações em uma única migration, pois dificulta o processo de revisão e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. rollback.
2. Nomeclatura Clara: Dê nomes descritivos como AdicionaColunaTelefone, RemoveTabelaAntiga, facilitando o entendimento por outros desenvolvedores.
3. Versões de Banco Bem Definidas: Mantenha um histórico claro de quais migrações já foram aplicadas em cada ambiente (desenvolvimento, homologação, produção).
4. Testar Antes de Produção: Sempre aplique a migração em um banco de teste para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! garantir que tudo ocorre como planejado.
5. Backup é seu Melhor Amigo: Antes de rodar grandes alterações, sempre faça backup do banco para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! ter um ponto de restauração.
Desafio Prático🔗
Objetivo: Migrar uma coluna TipoCliente
de string📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!Aprenda a dominar os segredos das strings em C# com técnicas de manipulação, concatenação, interpolação e boas práticas, impulsionando sua performance. para enum sem perder dados.
Passos:
2. Adicionar📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. nova coluna
TipoClienteId
3. Migration com SQL raw📊 Raw SQL no EF Core: Quando o ORM Não Basta!Descubra como aplicar Raw SQL no EF Core para consultas avançadas e stored procedures, garantindo performance, segurança e mapeamento preciso dos dados. para popular a nova coluna
Exemplo de migration:
migrationBuilder.Sql(
@"UPDATE Clientes
SET TipoClienteId = CASE
WHEN TipoCliente = 'Premium' THEN 1
ELSE 0 END");
Erros Comuns (e Como Evitá-los)🔗
Erro | Solução |
---|---|
Migration aplicada em dev sem commit | Usar dotnet ef migrations script para sincronizar |
Conflitos de merge no Snapshot | Resolver manualmente com diff tools |
Esquecer de atualizar o modelo | Sempre rodar testes após Add-Migration |
Pro Tip: Para sistemas legados (.NET Framework), as Migrations funcionam de forma similar no EF6, mas os comandos🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. são via Package Manager Console.
Conclusão🔗
Com migrations, você ganha agilidade e segurança na hora de evoluir o banco de dados da sua aplicação. A possibilidade de documentar cada mudança, aplicar em múltiplos ambientes e reverter rapidamente torna esse processo muito mais confiável do que mexer diretamente no SQL. Lembre-se: sempre realize testes e mantenha boas práticas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. para evitar sustos em produção. Assim, você garante que a evolução do banco acompanhando o crescimento do projeto não seja mais um problema, mas sim uma grande facilidade!
Migrations são sua ponte segura🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real. entre modelos de dados e evolução do sistema. Domine esse recurso
📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. e diga adeus aos pesadelos de alteração de esquemas! 🚀
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Referências🔗
- .NET Documentation: learn.microsoft.com/pt-br/dotnet/
- Awesome .NET: github.com/quozd/awesome-dotnet
- C# Language Specification: learn.microsoft.com/pt-br/dotnet/csharp/language-reference/language-specification/
- GitHub: Microsoft/.NET: github.com/dotnet
- Microsoft Learn: C# e .NET: learn.microsoft.com/pt-br/dotnet/csharp/