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 retroceder a una migración anterior, pero cuando agrego una nueva migración (fija) y ejecuto Update-Database, incluso se aplica la migración incorrecta.
Estaba tratando de retroceder a la migración anterior y eliminar el archivo con una migración incorrecta. Pero luego, cuando intento agregar una nueva migración, recibo 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 las líneas siguientes, EF está tratando de actualizar la tabla con nombre A: tal vez es un error de EF).
¿Hay alguna consulta que pueda ejecutar, que le diga a EF algo como "Olvidar la última migración como nunca existió, fue malo"? Algo como Eliminar-Migración.
Edit1
encontré la solución adecuada para mí. Cambio de modelo al buen estado y ejecución 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 actualizo Database a la mala migración, no encontré una buena manera de deshacer y crear una nueva migración, excluyendo la mala.
Gracias
fuente
Respuestas:
Tienes 2 opciones:
Puede quitar el Down de la migración incorrecta y colocarlo en una nueva migración (también deberá realizar los cambios posteriores en el modelo). Esto está efectivamente llegando a una mejor versión.
Utilizo esta opción en cosas que han ido a múltiples entornos.
La otra opción es ejecutar realmente
Update-Database –TargetMigration: TheLastGoodMigration
contra su base de datos desplegada y luego eliminar la migración de su solución. Esta es la alternativa de Hulk Smash y requiere que esto se realice en cualquier base de datos implementada con la versión incorrecta.Nota: para reorganizar la migración que puede usar
Add-Migration [existingname] -Force
. Sin embargo, esto sobrescribirá su migración existente, así que 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
Yo uso esta opción mientras desarrollo.
fuente
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 estos pasos: restaure su base de datos a la última migración correcta, elimine la migración incorrecta de su proyecto de Entity Framework, genere una nueva migración y aplíquela a la base de datos. Nota: a juzgar por los comentarios, estos comandos exactos pueden dejar de ser aplicables si está utilizando EF Core.
Paso 1: Restaurar a una migración anterior
Si aún no ha aplicado su migración, puede omitir esta parte. Para restaurar el esquema de su base de datos a un punto anterior, emita el comando Actualizar-Base de datos con la opción -TargetMigration para especificar la última migración correcta. Si su código de marco de entidad reside en un proyecto diferente en su solución, es posible que deba usar la opción '-Proyecto' o cambiar el proyecto predeterminado en la consola del administrador de paquetes.
Para obtener el nombre de la última buena migración, use el comando 'Get-Migrations' para recuperar una lista de los nombres de migración que se han aplicado a su base de datos.
Esta lista muestra primero las migraciones aplicadas más recientes. Elija la migración que se produce en la lista después de la que desea degradar, es decir, la que se aplica antes de la que desea degradar. Ahora emita una base de datos de actualización.
Todas las migraciones aplicadas después de la especificada se degradarán para comenzar con la última migración aplicada primero.
Paso 2: elimine su migración del proyecto
Si el
remove-migration
comando no está disponible en su versión de Entity Framework, elimine manualmente los archivos de la migración no deseada de la carpeta 'Migraciones' de su proyecto EF. En este punto, puede crear una nueva migración y aplicarla a la base de datos.Paso 3: agrega tu nueva migración
Paso 4: aplique su migración a la base de datos
fuente
add-migration "new migration"
,update-database
Para aquellos que usan EF Core con ASP.NET Core v1.0.0 , tuve un problema similar y utilicé los siguientes comandos para corregirlo (la publicación de @ DavidSopko me señaló en la dirección correcta, pero los detalles son ligeramente diferentes para EF Core) :
Por ejemplo, en mi desarrollo actual, el comando se convirtió en
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, la inicial y la mala), 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:
Al actualizar 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 solo y encontré el comando de error confuso:
Ya hay sugerencias para mejorar esta redacción, pero me gustaría que el error diga algo como esto:
La salida del comando de ayuda de EF Core sigue:
fuente
También puedes usar
Esto revertirá y eliminará la última migración aplicada
fuente
Primero, actualice su última migración perfecta con este comando:
Ejemplo:
Y, luego, elimine la migración no utilizada manualmente.
fuente
Update-Database 20180906131107_xxxx_xxxx
(sin guión) funcionó para mí. Ninguna versión deTargetMigration
como un interruptor funcionó. Estos comandos parecen ser un objetivo en movimiento (es decir, cambiarlos en cada versión)?A partir de .NET Core 2.2,
TargetMigration
parece haber desaparecido:Entonces esto funciona para mí ahora:
Además de (sin
-Migration
interruptor):En una nota adicional, ya no puede eliminar limpiamente las carpetas de migración sin poner su Instantánea del modelo fuera de sincronización. Entonces, si aprende esto de la manera difícil y termina con una migración vacía donde sabe que debería haber cambios, puede ejecutar (no se necesitan interruptores para la última migración):
Limpiará el desorden y lo devolverá a donde necesita estar, a pesar de que la última carpeta de migración se eliminó manualmente.
fuente
Para EF 6, aquí hay una línea si está volviendo a andamiar 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.
¿Por qué es esto necesario, preguntas? No estoy seguro de qué versiones de EF6 se aplica, pero si su nuevo objetivo de migración ya se ha aplicado, el uso de '-Force' para volver a andamio en Add-Migration no volverá a andamiaje, sino que creará un nuevo archivo (este es un buen aunque porque no querrías perder tu 'Down'). El fragmento anterior hace el 'Abajo' primero si es necesario y luego -Force funciona correctamente para volver a andamiaje.
fuente