c# - net - rollback migration entity framework core
ReversiĆ³n de Entity Framework y eliminar la mala migraciĆ³n (4)
Estoy usando EF 6.0 para mi proyecto en C # con migraciones manuales y actualizaciones. Tengo alrededor de 5 migraciones en la base de datos, pero me di cuenta de que la última migración fue mala y no la quiero. Sé que puedo retrotraerme a una migración anterior, pero cuando agrego una nueva migración (fija) y ejecuto la actualización de la base de datos, incluso se aplica la mala migración.
Estaba intentando retroceder a la migración anterior y eliminar el archivo con migración incorrecta. Pero cuando intento agregar una nueva migración, aparece un error al actualizar la base de datos, porque el archivo de migración está dañado (más específicamente, la primera línea de código cambia el nombre de la tabla A a B y son las siguientes líneas, EF intenta actualizar la tabla con nombre A - tal vez es un error de EF).
¿Hay alguna consulta que pueda ejecutar, que le diría a EF algo así como "Olvídese de la última migración como si nunca hubiera existido, fuera mala"? Algo así como Eliminar-Migración.
Edit1 Encontré la solución adecuada para mí. Cambiar el modelo al buen estado y ejecutar Add-Migration TheBadMigration -Force
. Esto volverá a andamiar la última migración no aplicada.
De todos modos, esto todavía no responde la pregunta original por completo. Si UpdateDatabase a la mala migración, no encontré una buena manera de deshacer y crear una nueva migración, excluyendo la mala.
Gracias
Para EF 6 aquí hay una línea si estás reconstruccionando mucho en desarrollo. Simplemente actualice los vars y luego siga usando la flecha hacia arriba en la consola del administrador de paquetes para enjuagar y repetir.
$lastGoodTarget = "OldTargetName"; $newTarget = "NewTargetName"; Update-Database -TargetMigration "$lastGoodTarget" -Verbose; Add-Migration "$newTarget" -Verbose -Force
¿Por qué es necesario que preguntes? No estoy seguro de qué versiones de EF6 esto aplica, pero si su nuevo objetivo de migración ya se ha aplicado, el uso de ''-Fuerza'' para volver a anclar en Agregar-Migración no volverá a andamiarse, sino que creará un nuevo archivo (este es un buen Sin embargo, porque no querría perder su ''Abajo''). El fragmento de arriba hace ''Abajo'' primero si es necesario, luego -Fuerza funciona correctamente para volver a andamiar.
Para aquellos que usan EF Core con ASP.NET Core v1.0.0 tuve un problema similar y usé los siguientes comandos para corregirlo (la publicación de @DavidSopko me indicó la dirección correcta, pero los detalles son ligeramente diferentes para EF Core) :
Update-Database <Name of last good migration>
Remove-Migration
Por ejemplo, en mi desarrollo actual el comando se convirtió
PM> Update-Database CreateInitialDatabase
Done.
PM> Remove-Migration
Done.
PM>
Remove-Migration eliminará la última migración que aplicó. Si tiene un escenario más complejo con múltiples migraciones para eliminar (solo tuve 2, el inicial y el malo), le sugiero que pruebe los pasos en un proyecto ficticio.
Actualmente, no parece haber un comando Get-Migrations en EF Core (v1.0.0) por lo que debe buscar en su carpeta de migraciones y estar familiarizado con lo que ha hecho. Sin embargo, hay un buen comando de ayuda:
PM> get-help entityframework
Actualización de la base de datos en VS2015 SQL Server Object Explorer, todos mis datos se conservaron y la migración que quería revertir desapareció :)
Inicialmente probé Remove-Migration por sí mismo y encontré el comando de error confuso:
System.InvalidOperationException: la migración ''...'' ya se ha aplicado a la base de datos. Desinscríbalo e inténtalo de nuevo. Si la migración se ha aplicado a otras bases de datos, considere revertir sus cambios utilizando una nueva migración.
Ya hay sugerencias para mejorar esta redacción, pero me gustaría que el error diga algo como esto:
Ejecute Update-Database (último nombre de migración correcto) para revertir el esquema de la base de datos a ese estado. Este comando des-aplicará todas las migraciones que ocurrieron después de la migración especificada a Update-Database. A continuación, puede ejecutar Remove-Migration (nombre de la migración para eliminar)
La salida del comando de ayuda EF Core sigue:
PM> get-help entityframework
_//__
---==/ //
___ ___ |. /|/
| __|| __| | ) ///
| _| | _| /_/ | //|//
|___||_| / //////
TOPIC
about_EntityFrameworkCore
SHORT DESCRIPTION
Provides information about Entity Framework Core commands.
LONG DESCRIPTION
This topic describes the Entity Framework Core commands. See https://docs.efproject.net for information on Entity Framework Core.
The following Entity Framework cmdlets are included.
Cmdlet Description
-------------------------- ---------------------------------------------------
Add-Migration Adds a new migration.
Remove-Migration Removes the last migration.
Scaffold-DbContext Scaffolds a DbContext and entity type classes for a specified database.
Script-Migration Generates a SQL script from migrations.
Update-Database Updates the database to a specified migration.
Use-DbContext Sets the default DbContext to use.
SEE ALSO
Add-Migration
Remove-Migration
Scaffold-DbContext
Script-Migration
Update-Database
Use-DbContext
Tienes 2 opciones:
Puede tomar el Abajo de la mala migración y ponerlo en una nueva migración (también deberá realizar los cambios posteriores en el modelo). Esto se está llevando a cabo para una mejor versión.
Uso esta opción en cosas que han ido a múltiples entornos.
La otra opción es ejecutar realmente
Update-Database –TargetMigration: TheLastGoodMigration
en su base de datos implementada y luego eliminar la migración de su solución. Esta es un poco la alternativa de Hulk Smash y requiere que esto se realice contra cualquier base de datos desplegada con la versión incorrecta.Nota: para volver a desplegar la migración puede usar
Add-Migration [existingname] -Force
. Sin embargo, esto sobrescribirá la migración existente, por lo tanto, asegúrese de hacerlo solo si ha eliminado la migración existente de la base de datos. Esto hace lo mismo que eliminar el archivo de migración existente y ejecutaradd-migration
Uso esta opción mientras desarrollo.
Como la pregunta indica, esto se aplica a una migración en un entorno de tipo de desarrollo que aún no se ha lanzado.
Este problema se puede resolver en dos pasos, el primer paso es restaurar su base de datos a la última migración correcta, y luego eliminar la mala migración de su proyecto Entity Framework.
Paso 1: restaurar a una migración anterior
Para restaurar el esquema de su base de datos a un punto anterior, use el:
Update-Database –TargetMigration: <name of last good migration>
Especificando la última buena migración. Si aún no ha aplicado su migración, puede omitir esta parte.
Use el comando Get-Migrations para obtener una lista de los nombres de migración que se han aplicado a su base de datos.
PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201508242303096_Bad_Migration
201508211842590_The_Migration_applied_before_it
201508211440252_And_another
Esta lista muestra primero las migraciones aplicadas más recientes. Seleccione la migración que ocurre en la lista después de la que desea degradar, es decir, la que se aplicó antes de la que desea degradar.
Update-Database –TargetMigration: "<the migration applied before it>"
Todas las migraciones aplicadas después de la especificada se degradarán en orden comenzando con la última migración aplicada primero.
Paso 2: elimina tu migración del proyecto
Ahora puede eliminar la mala migración de su carpeta EF ''Migraciones''.