Migraciones y gestión del esquema
Cree, aplique y revierta migraciones para evolucionar el esquema de su base de datos de forma segura.
Migraciones y gestión del esquema es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
¿Qué son las migraciones de EF Core?
Las migraciones son archivos generados a partir del código que describen cambios incrementales en el esquema de la base de datos. En lugar de escribir SQL DDL manualmente, EF Core lo genera y aplica automáticamente, manteniendo sincronizados el código y la base de datos.
Instalar las herramientas de EF Core
La herramienta CLI de EF Core (dotnet-ef) debe instalarse globalmente (o como herramienta local) para ejecutar comandos de migración desde el terminal.
# Install globally
dotnet tool install --global dotnet-ef
# Verify
dotnet ef --version
# Required NuGet packages in your project:
# Microsoft.EntityFrameworkCore.Design
# Microsoft.EntityFrameworkCore.SqlServer (or Sqlite, etc.)Crear su primera migración
dotnet ef migrations add compara el modelo actual con la última instantánea y genera un archivo de migración con los métodos Up() (aplicar) y Down() (revertir).
# Create initial migration
dotnet ef migrations add InitialCreate
# Output files created:
# Migrations/20240101_InitialCreate.cs <- Up/Down
# Migrations/20240101_InitialCreate.Designer.cs
# Migrations/AppDbContextModelSnapshot.cs <- current modelDentro de un archivo de migración
Cada migración tiene un método Up (aplica los cambios) y un método Down (los revierte). EF Core los genera automáticamente a partir de las diferencias del modelo.
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Products",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
Name = table.Column<string>(maxLength: 200, nullable: false),
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false)
},
constraints: table => table.PrimaryKey("PK_Products", x => x.Id));
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(name: "Products");
}
}Aplicar migraciones
dotnet ef database update aplica todas las migraciones pendientes. EF Core registra qué migraciones se han ejecutado en la tabla __EFMigrationsHistory.
# Apply all pending migrations
dotnet ef database update
# Apply up to a specific migration
dotnet ef database update AddProductIndex
# Roll back to a previous migration
dotnet ef database update InitialCreateMigración programática al iniciar la aplicación
En producción, puede aplicar las migraciones mediante código durante el inicio para que la base de datos esté siempre actualizada sin pasos manuales de la CLI.
var app = builder.Build();
// Apply pending migrations at startup
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await db.Database.MigrateAsync();
}
app.Run();Agregar una columna en una nueva migración
Agregue una propiedad a su entidad y, después, cree una nueva migración. EF Core detecta el cambio y genera una operación AddColumn.
// 1. Add property to entity
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = "";
public decimal Price { get; set; }
public string? Description { get; set; } // NEW
}
// 2. Generate migration
// dotnet ef migrations add AddProductDescription
// Generated Up():
migrationBuilder.AddColumn<string>(
name: "Description",
table: "Products",
nullable: true);Carga inicial de datos en las migraciones
Use HasData en OnModelCreating para cargar datos de referencia. EF Core los incluye en Up de la migración como instrucciones INSERT.
modelBuilder.Entity<Category>().HasData(
new Category { Id = 1, Name = "Electronics" },
new Category { Id = 2, Name = "Books" },
new Category { Id = 3, Name = "Clothing" }
);
// Then regenerate the migration:
// dotnet ef migrations add SeedCategoriesSQL personalizado en las migraciones
Cuando necesite DDL que EF Core no pueda generar automáticamente (desencadenadores, vistas o procedimientos almacenados), use migrationBuilder.Sql().
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql(@"
CREATE VIEW vw_ActiveProducts AS
SELECT Id, Name, Price
FROM Products
WHERE IsActive = 1
");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.Sql("DROP VIEW vw_ActiveProducts");
}Eliminar una migración
Si aún no ha aplicado una migración, puede eliminarla con dotnet ef migrations remove. Solo se puede eliminar de esta forma la última migración.
# Remove the last unapplied migration
dotnet ef migrations remove
# List all migrations and their status
dotnet ef migrations list
# Script all migrations to SQL (for DBA review)
dotnet ef migrations script --output deploy.sqlEn la práctica: estrategia de migraciones para CI/CD
En una canalización de CI/CD, genere un script de migración y deje que un administrador de bases de datos lo revise antes de aplicarlo en producción; nunca ejecute MigrateAsync() a ciegas en sistemas de producción críticos.
# Generate idempotent script for all pending migrations
dotnet ef migrations script --idempotent --output migrations.sql
# Review migrations.sql, then apply via sqlcmd / psql:
# sqlcmd -S server -d db -i migrations.sqlComprobación rápida
¿Qué tabla de EF Core registra qué migraciones ya se han aplicado a una base de datos?
Repaso: migraciones y administración del esquema
Conceptos clave:
dotnet ef migrations add <Name>genera archivos con cambios incrementales del esquema- Cada migración tiene métodos
Up()(aplicar) yDown()(revertir) dotnet ef database updateaplica las migraciones pendientes- Use
MigrateAsync()durante el inicio de la aplicación para automatizar las implementaciones - Genere scripts SQL idempotentes para que el administrador de bases de datos los revise en las canalizaciones de producción
Aprende C# con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 93
- Lecciones
- 346
Preguntas frecuentes
¿La lección «Migraciones y gestión del esquema» es gratis?
Sí — el texto completo de «Migraciones y gestión del esquema» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Migraciones y gestión del esquema»?
Cree, aplique y revierta migraciones para evolucionar el esquema de su base de datos de forma segura. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Migraciones y gestión del esquema»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Fundamentos de DbContext y DbSet
- Migraciones y gestión del esquema
- Operaciones CRUD con EF Core
- Relaciones: One-to-Many y Many-to-Many