Migraciones de bases de datos en C# (.NET): Guía completa
Gestionar los cambios en el esquema de la base de datos es una tarea crítica en el desarrollo de cualquier aplicación en C# (.NET). Las migraciones permiten versionar, rastrear y aplicar automáticamente los cambios en la estructura de la BD (agregar tablas, columnas, índices) de forma sincronizada con el código de la aplicación. En el ecosistema .NET existen varias herramientas maduras para esta tarea. En este artículo analizaremos en detalle tres enfoques principales: el mecanismo integrado de Entity Framework Core, y las bibliotecas especializadas FluentMigrator y DbUp.
1. Entity Framework Core Migrations (EF Core)
La forma más popular para proyectos que ya utilizan el ORM Entity Framework Core. Las migraciones están estrechamente integradas con tu modelo de datos (enfoque Code-First).
Instalación y configuración
Para trabajar con migraciones necesitarás instalar el paquete:
dotnet add package Microsoft.EntityFrameworkCore.ToolsCreación y aplicación de una migración
Después de modificar tus modelos de C# (por ejemplo, agregar una nueva propiedad Email a la clase User), ejecuta en la terminal:
dotnet ef migrations add AddEmailToUserdotnet ef database updateEl primer comando creará un archivo de migración con código C# generado automáticamente. El segundo lo aplicará a tu base de datos.
Ejemplo de código de migración (archivo generado):
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"); }}El método Up aplica los cambios, Down los revierte.
Ventajas y desventajas de EF Core Migrations
- Ventajas: Integración estrecha con los modelos, generación automática de código, soporte para reversiones, integrado en el ecosistema .NET.
- Desventajas: Dependencia de EF Core, complejidad al trabajar con cambios no triviales (por ejemplo, renombrar columnas), posibles problemas de conflictos en equipo.
2. FluentMigrator
Es una biblioteca independiente y ligera para migraciones, no vinculada a un ORM específico. Las migraciones se escriben manualmente en C# utilizando una interfaz fluida.
Instalación
dotnet add package FluentMigratorEjemplo de migración
[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"); }}Ejecución de migraciones
Para ejecutar las migraciones se utiliza un runner. Ejemplo de configuración en 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();Ventajas de F
También en la biblioteca
Envío de SMS en Java: Resumen y ejemplos de uso de bibliotecas API (Twilio, Nexmo)
Rate Limiting en PHP: guía completa para limitar solicitudes