Migrações de banco de dados em C# (.NET): Guia completo
Gerenciar alterações no esquema do banco de dados é uma tarefa crítica no desenvolvimento de qualquer aplicação em C# (.NET). As migrações permitem versionar, rastrear e aplicar automaticamente alterações na estrutura do BD (adição de tabelas, colunas, índices) de forma síncrona com o código da aplicação. No ecossistema .NET, existem várias ferramentas maduras para essa tarefa. Neste artigo, vamos detalhar três abordagens principais: o mecanismo embutido do Entity Framework Core, e as bibliotecas especializadas FluentMigrator e DbUp.
1. Migrações do Entity Framework Core (EF Core)
A forma mais popular para projetos que já utilizam o ORM Entity Framework Core. As migrações são fortemente integradas ao seu modelo de dados (abordagem Code-First).
Instalação e configuração
Para trabalhar com migrações, você precisará instalar o pacote:
dotnet add package Microsoft.EntityFrameworkCore.ToolsCriação e aplicação de migração
Após alterar seus modelos em C# (por exemplo, adicionar uma nova propriedade Email à classe User), execute no terminal:
dotnet ef migrations add AddEmailToUserdotnet ef database updateO primeiro comando cria um arquivo de migração com código C# gerado automaticamente. O segundo aplica essa migração ao seu banco de dados.
Exemplo de código de migração (arquivo gerado):
public partial class AddEmailToUser : Migration{ protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn<string>( name: "Email", table: "Users", type: "nvarchar(200)", nullable: true); }
protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "Email", table: "Users"); }}O método Up aplica as alterações, e o Down as reverte.
Vantagens e desvantagens das Migrações do EF Core
- Prós: Integração estreita com os modelos, geração automática de código, suporte a reversões, integrado ao ecossistema .NET.
- Contras: Dependência do EF Core, complexidade ao lidar com alterações não triviais (ex.: renomear colunas), possíveis problemas de conflitos em equipe.
2. FluentMigrator
É uma biblioteca independente e leve para migrações, não vinculada a um ORM específico. As migrações são escritas manualmente em C# usando uma interface fluente.
Instalação
dotnet add package FluentMigratorExemplo de migração
[Migration(202310010001)]public class CreateUserTable : Migration{ public override void Up() { Create.Table("Users") .WithColumn("Id").AsInt32().PrimaryKey().Identity() .WithColumn("Name").AsString(100).NotNullable() .WithColumn("Email").AsString(200).Nullable(); Create.Index("IX_Users_Email") .OnTable("Users") .OnColumn("Email"); }
public override void Down() { Delete.Table("Users"); }}Executando migrações
Para executar as migrações, utiliza-se um runner. Exemplo de configuração no Program.cs:
var serviceProvider = new ServiceCollection() .AddFluentMigratorCore() .ConfigureRunner(rb => rb .AddSqlServer() .WithGlobalConnectionString("YourConnectionString") .ScanIn(typeof(CreateUserTable).Assembly).For.Migrations()) .BuildServiceProvider();
using var scope = serviceProvider.CreateScope();var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();runner.MigrateUp();Vantagens do F
Também na biblioteca
ESLint + Plugins TypeScript para TypeScript: guia completo com exemplos
Guia completo de POCO C++ com exemplos práticos
GraphQL em C++: biblioteca cppgraphqlgen para APIs modernas
Rate Limiting em Swift: gerenciamento de frequência de requisições em iOS/macOS