Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tutorial, empezará a usar la EF Core característica de migraciones para administrar los cambios del modelo de datos. En tutoriales posteriores, agregarás más migraciones a medida que cambies el modelo de datos.
En este tutorial, usted hará lo siguiente:
- Más información sobre las migraciones
- Crea una migración inicial
- Examinar métodos Up y Down
- Más información sobre la instantánea del modelo de datos
- Aplicación de la migración
Prerequisites
About migrations
Cuando desarrollas una nueva aplicación, el modelo de datos cambia con frecuencia y cada vez que cambia, se desincroniza con la base de datos. Para iniciar estos tutoriales, configure Entity Framework para crear la base de datos si no existe. A continuación, cada vez que cambie el modelo de datos, agregue, quite o cambie las clases de entidad o cambie la clase DbContext, puede eliminar la base de datos y EF crea una nueva que coincida con el modelo y la inicialice con datos de prueba.
Este método de mantener la base de datos sincronizada con el modelo de datos funciona bien hasta que se implementa la aplicación en producción. Cuando la aplicación se ejecuta en producción, normalmente almacena los datos que desea conservar y no quiere perder todo cada vez que realice un cambio, como agregar una nueva columna. La EF Core característica Migraciones resuelve este problema al habilitar EF para actualizar el esquema de la base de datos en lugar de crear una nueva base de datos.
Para trabajar con migraciones, puede usar la consola del Administrador de paquetes (PMC) o la CLI. Estos tutoriales muestran cómo usar comandos de la CLI. La información sobre el PMC está al final de este tutorial.
Quitar la base de datos
Instale EF Core herramientas como una herramienta global y elimine la base de datos:
dotnet tool install --global dotnet-ef
dotnet ef database drop
Note
De manera predeterminada, la arquitectura de los binarios .NET que se van a instalar representa la arquitectura del sistema operativo que se está ejecutando en ese momento. Para especificar una arquitectura de SO diferente, consulta dotnet tool install, --arch option. Para obtener más información, consulta la incidencia de GitHub dotnet/AspNetCore.Docs #29262.
En la sección siguiente se explica cómo ejecutar comandos de la CLI.
Creación de una migración inicial
Guarde los cambios y compile el proyecto. A continuación, abra una ventana de comandos y vaya a la carpeta del proyecto. Esta es una manera rápida de hacerlo:
En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y elija Abrir carpeta en el Explorador de archivos en el menú contextual.
Escriba "cmd" en la barra de direcciones y presione Entrar.
Escriba el siguiente comando en la ventana de comandos:
dotnet ef migrations add InitialCreate
En los comandos anteriores, se muestra una salida similar a la siguiente:
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'
Si ve un mensaje de error "no puede acceder al archivo ... ContosoUniversity.dll porque otro proceso lo está usando", busque el icono de IIS Express en la bandeja del sistema de Windows y haga clic con el botón derecho en él y, a continuación, haga clic en ContosoUniversity > Stop Site.
Examinar los métodos Arriba y Abajo
Cuando ejecutó el migrations add comando, EF generó el código que creará la base de datos desde cero. Este código se encuentra en la carpeta Migraciones , en el archivo denominado <timestamp>_InitialCreate.cs. El Up método de la InitialCreate clase crea las tablas de base de datos que corresponden a los conjuntos de entidades del modelo de datos y el método los Down elimina, como se muestra en el ejemplo siguiente.
public partial class InitialCreate : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Course",
columns: table => new
{
CourseID = table.Column<int>(nullable: false),
Credits = table.Column<int>(nullable: false),
Title = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Course", x => x.CourseID);
});
// Additional code not shown
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Enrollment");
// Additional code not shown
}
}
Las migraciones llaman al método Up para implementar los cambios del modelo de datos. Cuando escriba un comando para revertir la actualización, Migrations llama al Down método .
Este código es para la migración inicial que se creó al escribir el migrations add InitialCreate comando. El parámetro de nombre de migración ("InitialCreate" en el ejemplo) se usa para el nombre de archivo y puede ser lo que desee. Es mejor elegir una palabra o frase que resuma lo que se hace en la migración. Por ejemplo, podría asignar un nombre a una migración posterior "AddDepartmentTable".
Si ha creado la migración inicial cuando la base de datos ya existe, se genera el código de creación de la base de datos, pero no tiene que ejecutarse porque la base de datos ya coincide con el modelo de datos. Al implementar la aplicación en otro entorno en el que la base de datos aún no existe, este código se ejecutará para crear la base de datos, por lo que es una buena idea probarla primero. Por eso eliminaste la base de datos anteriormente, para que las migraciones puedan crear una nueva desde cero.
Instantánea del modelo de datos
Las migraciones crean una instantánea del esquema de base de datos actual en Migrations/SchoolContextModelSnapshot.cs. Al agregar una migración, EF determina qué ha cambiado comparando el modelo de datos con el archivo de instantáneas.
Use el comando dotnet ef migrations remove para quitar una migración.
dotnet ef migrations remove elimina la migración y garantiza que la instantánea se restablezca correctamente. Si dotnet ef migrations remove se produce un error, use dotnet ef migrations remove -v para obtener más información sobre el error.
Consulte EF Core Migraciones en entornos de equipo para obtener más información sobre cómo se usa el archivo de instantáneas.
Aplicación de la migración
En la ventana de comandos, escriba el siguiente comando para crear la base de datos y las tablas en ella.
dotnet ef database update
La salida del comando es similar al migrations add comando, salvo que ve los registros de los comandos SQL que configuran la base de datos. La mayoría de los registros se omiten en la siguiente salida de ejemplo. Si prefiere no ver este nivel de detalle en los mensajes de registro, puede cambiar el nivel de registro en el appsettings.Development.json archivo. Para obtener más información, consulte Registro en .NET y ASP.NET Core.
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
IF SERVERPROPERTY('EngineEdition') <> 5
BEGIN
ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [__EFMigrationsHistory] (
[MigrationId] nvarchar(150) NOT NULL,
[ProductVersion] nvarchar(32) NOT NULL,
CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
);
<logs omitted for brevity>
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.
Use el Explorador de objetos de SQL Server para inspeccionar la base de datos como hizo en el primer tutorial. Observará la adición de una tabla de __EFMigrationsHistory que realiza un seguimiento de las migraciones que se han aplicado a la base de datos. Vea los datos de esa tabla y verá una fila para la primera migración. (El último registro del ejemplo de salida de la CLI anterior muestra la instrucción INSERT que crea esta fila).
Ejecute la aplicación para comprobar que todo funciona igual que antes.
Comparación de la CLI y PMC
Las herramientas de EF para administrar migraciones están disponibles desde comandos de la CLI de .NET o desde cmdlets de PowerShell en la ventana de la consola del Administrador de paquetes de Visual Studio (PMC). En este tutorial se muestra cómo usar la CLI, pero puede usar PMC si lo prefiere.
Los comandos de EF para los comandos PMC están en el paquete Microsoft.EntityFrameworkCore.Tools . Este paquete se incluye en el metapaquete de Microsoft.AspNetCore.App, por lo que no es necesario agregar una referencia de paquete si la aplicación tiene una referencia de paquete para Microsoft.AspNetCore.App.
Importante: Este no es el mismo paquete que el que instala para la CLI editando el .csproj archivo. El nombre de este finaliza en Tools, a diferencia del nombre del paquete de la CLI que termina en Tools.DotNet.
Para obtener más información sobre los comandos de la CLI, consulte LA CLI de .NET.
Para obtener más información sobre los comandos de PMC, vea Consola del Administrador de paquetes (Visual Studio) .
Obtención del código
Descargue o vea la aplicación completa.
Next step
Pase al siguiente tutorial para empezar a examinar temas más avanzados sobre cómo expandir el modelo de datos. A lo largo del proceso, estará creando y aplicando migraciones adicionales.