Descripción general de las migraciones
En proyectos reales, los modelos de datos cambian a medida que se implementan características: se agregan o se quitan nuevas entidades o propiedades, y los esquemas de base de datos se deben cambiar según corresponda para mantenerlos sincronizados con la aplicación. La característica de migraciones de EF Core proporciona una manera de actualizar incrementalmente el esquema de la base de datos para mantenerla sincronizada con el modelo de datos de la aplicación al tiempo que se conservan los datos existentes en la base de datos.
A nivel general, las migraciones funcionan de esta forma:
- Cuando se introduce un cambio en el modelo de datos, el desarrollador usa herramientas de EF Core para agregar una migración correspondiente en la que se describan las actualizaciones necesarias para mantener sincronizado el esquema de la base de datos. EF Core compara el modelo actual con una instantánea del modelo anterior para determinar las diferencias y genera los archivos de origen de la migración, de los que se puede realizar el seguimiento en el control de código fuente del proyecto como cualquier otro archivo de código fuente.
- Una vez que se ha generado una migración nueva, haya varias maneras de aplicarla a una base de datos. EF Core registra todas las migraciones aplicadas en una tabla de historial especial, lo que le permite saber qué migraciones se han aplicado y cuáles no.
El resto de esta página es una guía para principiantes paso a paso sobre el uso de las migraciones. Consulte las demás páginas de esta sección para obtener información más detallada.
Introducción
Imagine que acaba de completar la primera aplicación de EF Core, que contiene el siguiente modelo simple:
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
}
Durante el desarrollo, es posible que haya usado las API Create y Drop para realizar una iteración rápida y cambiar el modelo según las necesidades, pero ahora que la aplicación se destina a producción, necesita una manera de desarrollar de forma segura el esquema sin quitar la base de datos completa.
Instalación de las herramientas
En primer lugar, tendrá que instalar las herramientas de línea de comandos de EF Core:
- Por lo general, se recomienda usar las herramientas de la CLI de .NET Core, que funcionan en todas las plataformas.
- Si se siente más cómodo trabajando en Visual Studio o tiene experiencia con las migraciones de EF6, también puede usar las herramientas de la consola del administrador de paquetes.
Creación de la primera migración
Ya está listo para agregar la primera migración. Indique a EF Core que cree una migración llamada InitialCreate:
dotnet ef migrations add InitialCreate
EF Core creará un directorio denominado Migrations (Migraciones) en el proyecto y generará varios archivos. Es recomendable inspeccionar lo que EF Core ha generado exactamente y, posiblemente, rectificarlo, pero este paso se omitirá por ahora.
Creación de la base de datos y el esquema
En este momento puede hacer que EF cree la base de datos y el esquema a partir de la migración. Esto también se puede hacer mediante:
dotnet ef database update
Eso es todo: la aplicación está lista para ejecutarse en la base de datos nueva y no es necesario escribir una sola línea de SQL. Tenga en cuenta que esta manera de aplicar migraciones resulta idónea para el desarrollo local, pero es menos adecuada para los entornos de producción; vea la página Aplicación de migraciones para obtener más información.
Evolución del modelo
Han pasado unos días y le piden que agregue una marca de tiempo de creación a los blogs. Ha realizado los cambios necesarios en la aplicación y el ahora modelo tiene este aspecto:
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime CreatedTimestamp { get; set; }
}
Ahora el modelo y la base de datos de producción están desincronizados; tendrá que agregar una nueva columna al esquema de la base de datos. Cree una migración para esto:
dotnet ef migrations add AddBlogCreatedTimestamp
Tenga en cuenta que a las migraciones se les proporciona un nombre descriptivo para que después sea más fácil entender el historial del proyecto.
Como no se trata de la primera migración del proyecto, ahora EF Core compara el modelo actualizado con una instantánea del modelo anterior, antes de que se agregara la columna; la instantánea del modelo es uno de los archivos generados por EF Core cuando se agrega una migración y se inserta en el control de código fuente. En función de esa comparación, EF Core detecta que se ha agregado una columna y agrega la migración adecuada.
Ahora puede aplicar la migración como antes:
dotnet ef database update
Tenga en cuenta que, en esta ocasión, EF detecta que la base de datos ya existe. Además, cuando antes se ha aplicado la primera migración, esta operación se ha registrado en una tabla de historial de migraciones especial en la base de datos, lo que permite que EF solo aplique de forma automática la nueva migración.
Exclusión de elementos del modelo
En ocasiones, es posible que quiera consultar tipos de otro DbContext. Esto puede dar lugar a conflictos de migración. Para evitarlo, excluya el tipo de las migraciones de uno de los elementos DbContext.
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<IdentityUser>()
.ToTable("AspNetUsers", t => t.ExcludeFromMigrations());
}
Pasos siguientes
Lo anterior solo era una breve introducción a las migraciones. Consulte las demás páginas de documentación para obtener más información sobre cómo administrar migraciones, aplicarlas y otros aspectos. La referencia de herramientas de la CLI de .NET Core también contiene información útil sobre los distintos comandos
Recursos adicionales
- Referencia de herramientas de Entity Framework Core - CLI de .NET Core: incluye comandos para actualizar, quitar, agregar, etc.
- Referencia de herramientas de Entity Framework Core - consola del administrador de paquetes en Visual Studio: incluye comandos para actualizar, quitar, agregar, etc.
- Sesión de reunión de la comunidad de datos de .NET, donde se analizan las nuevas características de migración de EF Core 5.0.