Esto parece una tarea realmente común, pero no puedo encontrar una manera fácil de hacerlo.
Quiero deshacer la última migración aplicada. Hubiera esperado un comando simple, como
PM> Update-Database -TargetMigration:"-1"
En cambio, todo lo que se me ocurre es:
PM> Get-Migrations
Retrieving migrations that have been applied to the target database.
201208012131302_Add-SystemCategory
201207311827468_CategoryIdIsLong
201207232247409_AutomaticMigration
201207211340509_AutomaticMigration
201207200025294_InitialCreate
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
(Al menos puedo usar solo el nombre, omitiendo la marca de tiempo ...)
hay una manera mas facil?
entity-framework
entity-framework-4
database-migration
ef-migrations
Cristian Diaconescu
fuente
fuente
Respuestas:
A partir de EF 5.0, el enfoque que describe es la forma preferida. Entonces
PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"
o usando tus migraciones de ejemplo
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
Una solución sería crear un script PS envoltorio que automatice los pasos anteriores. Además, siéntase libre de crear una solicitud de función para esto, o mejor aún, ¡intente implementarlo! https://github.com/dotnet/ef6
fuente
dotnet ef database update LastGoodMigration
sin embargo, esto parece confuso ya que vengo de un fondo de nodo y uso knex, sequlize, tienen un comando para revertir el último cambio, ¿hay algún comando para revertir la última acción que se aplicó a la base de datos? ?Quiero agregar algunas aclaraciones a este hilo:
Lo que está haciendo arriba es decir que desea revertir todas las migraciones HASTA que quede con la migración especificada. Por lo tanto, si usa GET-MIGRATIONS y descubre que tiene A, B, C, D y E, entonces, al usar este comando, E y D retrocederán para llegar a C:
Además, a menos que alguien pueda comentar lo contrario, noté que puede usar un valor ordinal y el interruptor corto -Target (por lo tanto, -Target es lo mismo que -TargetMigration). Si desea revertir todas las migraciones y comenzar de nuevo, puede usar:
0, arriba, revertiría incluso la PRIMERA migración ( este es un comando destructivo; ¡asegúrese de saber lo que está haciendo antes de usarlo! ), Algo que no puede hacer si usa la sintaxis anterior que requiere el nombre de la migración de destino (¡el nombre de la 0ª migración no existe antes de que se aplique una migración!). Entonces, en ese caso, debe usar el valor 0 (ordinal). Del mismo modo, si ha aplicado las migraciones A, B, C, D y E (en ese orden), el ordinal 1 debería referirse a A, el ordinal 2 debería referirse a B, y así sucesivamente. Entonces, para retroceder a B, puede usar:
o
Editar octubre de 2019:
De acuerdo con esta respuesta relacionada en una pregunta similar, el comando correcto es
-Target
para EF Core 1.1 mientras que-Migration
para EF Core 2.0.fuente
$InitialDatabase
.ls variable:*
parece ser$InitialDatabase
simplemente una variable de PowerShell definida como 0, no hay otras definidas, incluso en el código fuente EF actual. Y, get-migrations no devuelve nada, solo escribe en la consola, por lo que no puede iterar sobre los objetos devueltos ...En EntityFrameworkCore :
donde
20161012160749_AddedOrderToCourse
es un nombre de migración al que desea revertir.fuente
La solucion es:
fuente
Recordatorio adicional:
Si tiene varios tipos de configuración, debe especificar el [ConfigurationName]
fuente
En EF Core, puede ingresar el comando
Remove-Migration
en la consola del administrador de paquetes después de haber agregado su migración errónea.La consola sugiere que lo haga si su migración puede implicar una pérdida de datos:
fuente
Advertencia : ¡Esto revertirá TODAS las migraciones en EFCore! Por favor, use con cuidado :)
fuente
Descubrí que esto funciona cuando se ejecuta en la consola de Package Manager:
dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }
Podría crear un script que lo haga más fácil.
fuente
Estoy usando EntityFrameworkCore y uso la respuesta de @MaciejLisCK. Si tiene múltiples contextos de base de datos, también deberá especificar el contexto agregando el parámetro de contexto, por ejemplo:
Update-Database 201207211340509_MyMigration -context myDBcontext
(¿Dónde
201207211340509_MyMigration
está la migración a la que desea revertir ymyDBcontext
es el nombre de su contexto DB?)fuente
Para este problema sugiero este enlace:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
fuente
En caso de que exista la posibilidad de que dataloss EF no complete el comando de actualización de la base de datos, ya que AutomaticMigrationDataLossAllowed = false de manera predeterminada, roolbacks la acción a menos que la ejecute con el parámetro -force .
o
fuente