Cómo no aplicar una migración en ASP.NET Core con EF Core

180

Cuando ejecuto PM> Remove-Migration -context BloggingContextVS2015 con un proyecto ASP.NET Core con EF Core, aparece el siguiente error:

System.InvalidOperationException: The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.    at Microsoft.EntityFrameworkCore.Migrations.Design.MigrationsScaffolder.RemoveMigration(String projectDir, String rootNamespace, Boolean force) 
    at Microsoft.EntityFrameworkCore.Design.MigrationsOperations.RemoveMigration(String contextType, Boolean force) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.MigrationsRemoveCommand.<>c__DisplayClass0_0.<Configure>b__0() 
    at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) 
    at Microsoft.EntityFrameworkCore.Tools.Cli.Program.Main(String[] args) 
 The migration '20160703192724_MyFirstMigration' has already been applied to the database. Unapply it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.

¿Cómo puedo no aplicarlo? Estoy usando la última versión de ASP.NET Core 1.0, EF Core y VS2015 Update 3.

nam
fuente
3
intente agregar -forceal final
prospector
1
El artículo learnentityframeworkcore.com/migrations#reversing-a-migration describe los pasos. Gracias @drewskis por el enlace
Michael Freidgeim
Gracias @MichaelFreidgeim
Drewskis

Respuestas:

215

Utilizar:

CLI

> dotnet ef database update <previous-migration-name>

Consola de administrador de paquetes

PM> Update-Database <previous-migration-name>

Ejemplo:

PM> Update-Database MyInitialMigration

Luego intente eliminar la última migración.

Eliminar la migración sin actualizar la base de datos no funciona porque aplicó cambios a la base de datos.

Si usa PMC, intente: PM> update-database 0 Esto borrará la base de datos y le permitirá eliminar la instantánea de migración de su solución

Adem Caglin
fuente
66
Todavía recibo el mismo error. La primera vez dotnet ef database update MyFirstMigration --context BloggingContextque usé eso funcionó con éxito. Luego corrí dotnet ef migrations remove --context BloggingContextque me dio el mismo mensaje de error que en mi publicación
nam
14
Deberá actualizar a la migración antes MyFirstMigration. Si esa es la primera migración (como su nombre lo indica), puede usar dotnet ef database update 0para revertir (no aplicar) todas las migraciones de la base de datos. Entonces deberías poder correr dotnet ef migrations remove.
bvpb
También vale la pena señalar que solo debe usar el nombre de la migración, excluyendo el prefijo de fecha
estructurado el
2
Llama dotnet ef migrations removedespués de esto
Chamika Sandamal
Su segunda declaración: "Entonces intente eliminar la última migración" no está completa en esta respuesta, por favor diga exactamente lo que quiere decir. eliminar el archivo de migración? ejecutar un comando? ...
S.Serpooshan
125

Para eliminar por completo todas las migraciones y comenzar de nuevo, haga lo siguiente:

dotnet ef database update 0
dotnet ef migrations remove
Ronald Ramos
fuente
1
Pero no desea eliminar todas las migraciones. Por ejemplo, desea mantener la migración predeterminada que VS crea para la identidad (Cuentas de usuario) en la carpeta Datos \ Migraciones.
nam
Es bueno saberlo dotnet ef database update 0, pero la ejecución dotnet ef migrations removeposterior eliminará la migración predeterminada para Identity, lo que podría no ser deseado.
kimbaudi
Gracias por el consejo dotnet ef database update 0! No había visto esto mencionado en ninguna parte ...
Tobias J
3
@nam "Pero no desea eliminar todas las migraciones". Pero algunos de nosotros lo hacemos. No asumas lo que quiero :)
starmandeluxe
3
Esto no funcionó para mí. La primera línea estaba bien y elimino todas las migraciones, en la segunda línea todavía obtengoThe migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
Ido Ran
52

Todavía puedes usar el Update-Databasecomando.

Update-Database -Migration <migration name> -Context <context name>

Sin embargo, a juzgar por el nombre de su migración, supongo que es la primera migración, por lo que ese comando puede no funcionar. Debería poder eliminar la entrada de la __MigrationHistorytabla en su base de datos y luego ejecutar el Remove-Migrationcomando nuevamente. También puede eliminar el archivo de migración y comenzar de nuevo.

Puntilla
fuente
Puede llamar Update-Databasedesde Package Management Console o dotnet ef database updatedesde el símbolo del sistema desde el directorio del proyecto.
kimbaudi
77
Solo para aclarar la respuesta de Brad aquí, <migration name>debe ser el nombre de la migración a la que desea regresar (es decir, probablemente la migración anterior a la que arruinó), no el nombre de la migración que desea deshacer.
Mark Amery
52

Para no aplicar una (s) migración (es) específica (s) :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

Para no aplicar todas las migraciones :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

Para eliminar la última migración:

dotnet ef migrations remove
or
PM> Remove-Migration

Para eliminar todas las migraciones:

solo elimina la Migrationscarpeta.

Para eliminar las últimas migraciones (no todas):

No hay un comando para eliminar un montón de migraciones y no podemos simplemente eliminar estos pocos migrationsy sus *.designer.csarchivos, ya que necesitamos mantener el archivo de instantánea en el estado consistente. Necesitamos eliminar las migraciones una por una (ver To remove last migrationarriba).

Para no aplicar y eliminar la última migración:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force
AlbertK
fuente
Sigo viendo la palabra en unapplytodas estas publicaciones. Simplemente me un - apply
llamó la atención
28

Para revertir la última migración aplicada, debe (comandos de la consola del administrador de paquetes):

  1. Revertir la migración de la base de datos: PM> Update-Database <prior-migration-name>
  2. Elimine el archivo de migración del proyecto (o se volverá a aplicar en el siguiente paso)
  3. Actualice la instantánea del modelo: PM> Remove-Migration

UPD : el segundo paso parece no ser necesario en las últimas versiones de Visual Studio (2017).

Dmitry Polomoshnov
fuente
1
¡Gracias! Esto funcionó perfectamente Fascinado de que de todas las soluciones nadie mencionara la necesidad del paso 2.
Michael Kargl
Sí, nadie mencionó el paso dos
Gracias
No estoy seguro sobre el segundo paso, en mi caso (el último VS2017), el archivo de migración se eliminará automáticamente después de llamar Remove-Migrationsin problemas. ¡No estoy seguro de lo que dijiste "se volverá a aplicar en el próximo paso"!
S.Serpooshan
@ S.Serpooshan De hecho. Lo eliminé manualmente, pero cuando ejecuté Remove-Migration se quejó de que mi migración anterior se había aplicado a la base de datos. Pero funciona.
MetalMikester
Creo que el segundo paso solo es necesario si llamas dbContext.Database.Migrate()a tu startup.cs
user3413723
23

Simplemente puede orientar una migración por valor

 Update-Database -Migration:0

Luego, adelante y retíralo

 Remove-Migration
John Nyingi
fuente
1
Esto funcionó para mí, pero estoy usando EF y .NET core 2.0 con VS2017
James Morrison
2
Cuidado: -Migración: 0 significa volver al estado sin migraciones. Esto borrará su base de datos
Kieren Johnstone
Sí, de acuerdo con la pregunta formulada. Puede incrementar el valor dependiendo de la migración a la que quiera volver
John Nyingi
11

Para "no aplicar" la migración más (¿reciente?) Después de que ya se haya aplicado a la base de datos:

  1. Abra el Explorador de objetos de SQL Server (Ver -> "Explorador de objetos de SQL Server")
  2. Navegue a la base de datos que está vinculada a su proyecto expandiendo los triángulos pequeños a un lado.
  3. Expandir "Tablas"
  4. Busque la tabla llamada "dbo._EFMigrationsHistory".
  5. Haga clic derecho sobre él y seleccione "Ver datos" para ver las entradas de la tabla en Visual Studio.
  6. Elimine la fila correspondiente a su migración que no desea aplicar (diga "sí" a la advertencia, si se le solicita).
  7. Ejecute "dotnet ef migrations remove" nuevamente en la ventana de comandos en el directorio que tiene el archivo project.json. Alternativamente, ejecute el comando "Remove-Migration" en la consola del administrador de paquetes.

Espero que esto ayude y sea aplicable a cualquier migración en el proyecto ... Probé esto solo con la migración más reciente ...

¡Feliz codificación!

Raj
fuente
21
Esto en realidad no anulará la aplicación de la migración, solo hará que el marco "piense" que no se ha aplicado. Su base de datos estará en un estado inconsistente si hace esto.
mark.monteiro
Editar manualmente los datos en su __EFMigrationsHistory es un consejo terrible. No lo hagas Esa tabla solo debe ser utilizada bajo el capó por las herramientas de migración. Si comienza a editar manualmente los datos, un solo error puede crear todo tipo de comportamiento inesperado en su proyecto. Es una idea mucho mejor usar una de las otras soluciones recomendadas.
Joe Irby
Tuvimos una situación en la que un miembro del equipo junior se confundió con el cambio de sucursales y terminó eliminando la migración manualmente de ambos (aunque todavía estaba en la tabla __EFMigrationsHistory ya que ya estaba aplicada), por lo que perdimos el "down". Esto es lo que terminamos teniendo que hacer, además de algunas reversiones manuales en SSMS. Así que no lo hagas, a menos que no tengas otra opción en este momento. Al menos todo lo que hizo fue agregar un solo campo nuevo.
Ella
10

Debe eliminar el registro de migración '20160703192724_MyFirstMigration' de la tabla '_EFMigrationsHistory' .

de lo contrario, este comando eliminará la migración y eliminará la carpeta de migraciones:

   > remove-migration -force
AminGolmahalle
fuente
7

En general, si está utilizando la consola de Package Manager, la forma correcta de eliminar una migración específica es haciendo referencia al nombre de la migración

Update-Database -Migration {Name of Migration} -Context {context}

Otra forma de eliminar la última migración que ha aplicado según los documentos es mediante el comando:

dotnet ef migrations remove

Este comando debe ejecutarse desde el símbolo del sistema del desarrollador ( cómo abrir el símbolo del sistema ) dentro del directorio de la solución.

Por ejemplo, si su aplicación está dentro del nombre "Aplicación" y está en la carpeta c: \ Proyectos. Entonces tu camino debería ser:

C:\Projects\Application
Anastasios Selmanis
fuente
1
La pregunta era qué hacer si `dotnet ef migrations remove 'devuelve un error" La migración ya se ha aplicado a la base de datos "
Michael Freidgeim
2

Para no aplicar una migración en EF Core 1.0, use el comando:

actualización de la base de datos de dotnet ef {Migration_name}

Use el nombre de la migración hasta la cual desea conservar sus cambios. La lista de nombres de la migración se puede encontrar usando:

lista de migraciones de dotnet ef

Rufus Lobo
fuente
2

Para revertir todas las migraciones que se aplican a DB simplemente ejecute:

update-database 0

Debe seguir ejecutándose Remove-Migrationtantas veces como haya archivos de migración visibles en el directorio de Migración. El comando elimina la última migración y también actualiza la instantánea.

Dipendu Paul
fuente
1

Al principio ejecute el siguiente comando:

PM>update-database -migration:0

y luego ejecuta este:

PM>remove_migration

Terminar

Abbas Hadavandi
fuente
0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();
Kishor Gujar
fuente
-1

1.Encuentre la tabla "dbo._EFMigrationsHistory", luego elimine el registro de migración que desea eliminar. 2. ejecute "remove-migration" en PM (Package Manager Console). Funciona para mi.

Átomo
fuente
Esto conducirá a un estado inconsistente de la base de datos (p. Ej., Una columna ya se descartó)
UNeverNo