web-dev-qa-db-fra.com

EF Migrations: Restaurer la dernière migration appliquée?

Cela ressemble à une tâche très commune, mais je ne trouve pas de moyen facile de le faire.

Je veux annuler la dernière migration appliquée. Je m'attendais à une commande simple, comme

PM> Update-Database -TargetMigration:"-1"

Au lieu de cela, tout ce que je peux trouver est:

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"

(Au moins, je peux utiliser seulement le nom, en sautant l'horodatage ...)

Y a-t-il un moyen plus facile?

398
Cristi Diaconescu

A partir de EF 5.0, l'approche que vous décrivez est la méthode préférée. Une solution serait de créer un script PS wrapper qui automatise les étapes ci-dessus. De plus, n'hésitez pas à créer une demande de fonctionnalité à cet effet ou, mieux encore, à tenter de l'implémenter! http://entityframework.codeplex.com/

136
Andrew Peters

Je veux ajouter quelques précisions à ce sujet:

Update-Database -TargetMigration:"name_of_migration"

Ce que vous faites ci-dessus indique que vous souhaitez annuler toutes les migrations jusqu'à ce que la migration spécifiée vous reste. Ainsi, si vous utilisez GET-MIGRATIONS et constatez que vous avez A, B, C, D et E, alors cette commande annulera E et D pour vous amener à C:

Update-Database -TargetMigration:"C"

De plus, à moins que quelqu'un ne puisse dire le contraire, j'ai remarqué que vous pouvez utiliser une valeur ordinale et le commutateur short -Target (ainsi, -Target est identique à -TargetMigration). Si vous souhaitez annuler toutes les migrations et recommencer, vous pouvez utiliser:

update-database -target:0

0, ci-dessus, annulerait la première migration (, il s'agit d'une commande destructive - assurez-vous de savoir ce que vous faites avant de l'utiliser! ) - quelque chose que vous ne pouvez pas faire si vous utilisez la syntaxe ci-dessus qui nécessite le nom de la migration cible (le nom de la 0e migration n'existe pas avant l'application d'une migration!). Donc, dans ce cas, vous devez utiliser la valeur 0 (ordinale). De même, si vous avez appliqué les migrations A, B, C, D et E (dans cet ordre), l'ordinal 1 doit faire référence à A, l'ordinal 2 doit faire référence à B, etc. Donc, pour revenir à B, vous pouvez utiliser soit:

Update-Database -TargetMigration:"B"

ou

Update-Database -TargetMigration:2

Edit Jan 2019:

Selon cette relation réponse sur une question similaire, le nom de paramètre correct est -Target (pour EF Core 1.1) ou -Migration (pour EF Core 2.0).

371
Jazimov

Dans EntityFrameworkCore:

Update-Database 20161012160749_AddedOrderToCourse

20161012160749_AddedOrderToCourse est le nom de la migration à laquelle vous souhaitez revenir.

60
MaciejLisCK

La solution est:

Update-Database –TargetMigration 201609261919239_yourLastMigrationSucess
11
Max

Rappel supplémentaire:

Si vous avez plusieurs types de configuration, vous devez spécifier le [Nom de configuration]

Update-Database -Configurationtypename [ConfigurationName] -TargetMigration [MigrationName]
3
Amos
update-database 0

This will roll back all migrations in EFCore
2
user1883961

Dans EF Core, vous pouvez entrer la commande Remove-Migration dans la console du gestionnaire de packages après avoir ajouté votre migration erronée.

La console vous suggère de le faire si votre migration peut entraîner une perte de données:

Une opération a été échafaudée, ce qui peut entraîner une perte de données. Veuillez vérifier l'exactitude de la migration. Pour annuler cette action, utilisez Remove-Migration.

1

J'utilise EntityFrameworkCore et j'utilise la réponse de @MaciejLisCK. Si vous avez plusieurs contextes de base de données, vous devrez également spécifier le contexte en ajoutant le paramètre context, par exemple. :

Update-Database 201207211340509_MyMigration -context myDBcontext

(où 201207211340509_MyMigration est la migration à laquelle vous souhaitez revenir et myDBcontext est le nom de votre contexte de base de données)

0
Chris Halcrow