Las migraciones de Entity Framework Core (EF Core) son una de las mejores herramientas para mantener sincronizada la estructura de la base de datos con el modelo de tu aplicación. Sin embargo, utilizarlas de forma incorrecta puede provocar caídas del sistema, pérdida de información o errores difíciles de corregir en producción.
La buena noticia es que, siguiendo algunas buenas prácticas, puedes implementar cambios en la base de datos de forma segura, controlada y profesional.
¿Qué son las migraciones?
Las migraciones permiten registrar los cambios realizados en las entidades de tu aplicación y convertirlos en instrucciones SQL que modifican la base de datos.
Cada migración representa una versión del esquema, lo que facilita llevar un historial de los cambios y mantener todos los ambientes sincronizados.
Por ejemplo, al agregar una nueva propiedad a una entidad:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public string Description { get; set; }
}
Puedes crear una migración ejecutando:
dotnet ef migrations add AddProductDescription
Y luego aplicarla con:
dotnet ef database update
Aunque parece sencillo, en producción el proceso requiere mucho más cuidado.
Nunca modifiques una migración ya aplicada
Uno de los errores más comunes es editar un archivo de migración después de haber sido ejecutado en otro ambiente.
Si una migración ya llegó a producción, debe considerarse inmutable.
Si necesitas corregir algo, crea una nueva migración.
Esto garantiza que todos los desarrolladores y servidores mantengan exactamente el mismo historial.
Revisa siempre el SQL generado
Antes de actualizar una base de datos productiva, genera el script SQL correspondiente.
dotnet ef migrations script
O incluso desde una migración específica:
dotnet ef migrations script InitialCreate AddCustomerTable
Revisar el SQL permite detectar:
- Eliminación accidental de columnas.
- Cambios peligrosos de tipos de datos.
- Índices eliminados.
- Restricciones incorrectas.
- Operaciones que podrían bloquear tablas grandes.
En muchas empresas, este script es revisado por el DBA antes de ejecutarse.
Evita ejecutar Database.Migrate() en producción
Muchos proyectos incluyen esta línea:
app.Services.CreateScope()
.ServiceProvider
.GetRequiredService<AppDbContext>()
.Database.Migrate();
Aunque es útil durante el desarrollo, no es recomendable en producción.
Si la aplicación inicia varias instancias simultáneamente, podrían intentar ejecutar la misma migración al mismo tiempo, provocando bloqueos o errores.
Lo más seguro es ejecutar las migraciones como parte del proceso de despliegue (CI/CD) antes de publicar la nueva versión.
Realiza cambios compatibles
Cuando el sistema ya está en uso, evita cambios que rompan versiones anteriores.
Por ejemplo, si necesitas agregar una columna obligatoria:
❌ Incorrecto:
- Crear una columna NOT NULL sin valor por defecto.
✔ Correcto:
- Crear la columna permitiendo NULL.
- Llenar los datos existentes.
- Actualizar la aplicación.
- Crear otra migración que haga la columna obligatoria.
Este enfoque evita interrupciones mientras conviven diferentes versiones de la aplicación.
Nunca elimines datos sin respaldo
Antes de ejecutar migraciones importantes:
- Realiza un respaldo completo.
- Prueba la restauración.
- Verifica que puedas volver atrás si ocurre algún problema.
Un backup es la mejor protección ante errores inesperados.
Prueba las migraciones en un ambiente similar
Nunca ejecutes una migración directamente en producción sin haberla probado.
Lo ideal es contar con un entorno de Staging que tenga:
- El mismo motor de base de datos.
- Una cantidad de información similar.
- Configuración equivalente a producción.
Así podrás medir tiempos de ejecución y detectar posibles bloqueos.
Usa migraciones pequeñas
Evita crear una única migración con decenas de cambios.
Es mejor dividir el trabajo en migraciones pequeñas y fáciles de revisar.
Por ejemplo:
- Agregar tabla de clientes.
- Agregar índices.
- Crear relaciones.
- Agregar columnas nuevas.
Esto facilita el mantenimiento y simplifica una posible reversión.
Automatiza el proceso
En proyectos profesionales, las migraciones suelen integrarse al pipeline de CI/CD.
Un flujo típico sería:
- Compilar la aplicación.
- Ejecutar pruebas automáticas.
- Generar el script SQL.
- Revisar el script.
- Ejecutar la migración en producción.
- Publicar la nueva versión.
Este enfoque reduce errores manuales y mejora la trazabilidad de cada cambio.
Las migraciones de Entity Framework Core son una herramienta poderosa, pero deben utilizarse con disciplina. Evitar modificar migraciones ya aplicadas, revisar siempre el SQL generado, probar los cambios en un entorno de Staging, realizar respaldos y desplegar mediante un proceso automatizado son prácticas fundamentales para proteger la integridad de la base de datos.
Aplicando estas recomendaciones podrás evolucionar el esquema de tus aplicaciones .NET con seguridad, minimizar riesgos en producción y mantener un historial de cambios claro y confiable, incluso en proyectos empresariales de gran escala.

