286 votes

Comment désappliquer une migration dans ASP.NET Core avec EF Core

Quand je cours PM> Remove-Migration -context BloggingContext dans VS2015 avec un projet ASP.NET Core utilisant EF Core, j'obtiens l'erreur suivante :

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.

Comment puis-je le désappliquer ? J'utilise la dernière version d'ASP.NET Core 1.0, EF Core et VS2015 Update 3.

11 votes

Essayez d'ajouter -force à la fin

1 votes

L'article learnentityframeworkcore.com/migrations#reversing-a-migration décrit les étapes. Merci @drewskis pour le lien

0 votes

Merci @MichaelFreidgeim

342voto

adem caglin Points 9337

Utilisez :

CLI

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

Console du gestionnaire de paquets

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

Exemple :

PM> Update-Database MyInitialMigration

Ensuite, essayez d'enlever la dernière migration.

La suppression de la migration sans mise à jour de la base de données ne fonctionne pas car vous avez appliqué des modifications à la base de données.

Si vous utilisez PMC, essayez : PM> update-database 0 Cela effacera la base de données et vous permettra de supprimer le snapshot de migration sur votre solution.

6 votes

Je reçois toujours la même erreur. J'ai d'abord utilisé dotnet ef database update MyFirstMigration --context BloggingContext qui a fonctionné avec succès. Ensuite, j'ai exécuté dotnet ef migrations remove --context BloggingContext qui m'a donné le même message d'erreur que dans mon post

21 votes

Vous devrez faire une mise à jour de la migration avant MyFirstMigration . S'il s'agit de la 1ère migration (comme le nom l'indique), vous pouvez alors utiliser dotnet ef database update 0 pour annuler (unapply) toutes les migrations de la base de données. Vous devriez alors être en mesure d'exécuter dotnet ef migrations remove .

2 votes

Il convient également de noter que vous ne devez utiliser que le nom de la migration, sans le préfixe de date.

153voto

Ronald Ramos Points 2353

Pour supprimer complètement toutes les migrations et recommencer à zéro, procédez comme suit :

dotnet ef database update 0
dotnet ef migrations remove

3 votes

Mais vous ne voulez pas supprimer toutes les migrations. Par exemple, vous voulez conserver la migration par défaut que VS crée pour l'identité (Comptes d'utilisateurs) sous Données \Migrations dossier.

2 votes

C'est bon à savoir dotnet ef database update 0 mais en courant dotnet ef migrations remove après cela, la migration par défaut pour l'identité sera supprimée, ce qui pourrait ne pas être souhaité.

0 votes

Merci pour le conseil sur dotnet ef database update 0 ! Je n'avais vu cela mentionné nulle part...

53voto

Brad Points 2876

Vous pouvez toujours utiliser le Update-Database commandement.

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

Cependant, à en juger par le nom de votre migration, je suppose qu'il s'agit de la première migration, donc cette commande peut ne pas fonctionner. Vous devriez être en mesure de supprimer l'entrée de la section __MigrationHistory dans votre base de données, puis exécutez la commande Remove-Migration commande à nouveau. Vous pouvez également supprimer le fichier de migration et recommencer.

0 votes

Vous pouvez appeler Update-Database à partir de la console de gestion des paquets ou appelez dotnet ef database update à l'invite de commande depuis le répertoire du projet.

9 votes

Juste pour clarifier la réponse de Brad ici - <migration name> devrait être le nom de la migration que vous voulez revenir à (c'est-à-dire probablement la migration avant celle que vous avez foirée), et non le nom de la migration que vous voulez annuler.

28voto

John Nyingi Points 188

Vous pouvez simplement cibler une migration par valeur

 Update-Database -Migration:0

Alors allez-y et retirez-le

 Remove-Migration

1 votes

Cela a fonctionné pour moi, mais j'utilise EF et .NET core 2.0 avec VS2017.

4 votes

Attention : -Migration:0 signifie revenir à l'état sans migrations. Cela effacera votre base de données.

0 votes

Oui, selon la question posée. Vous pouvez incrémenter la valeur en fonction de la migration vers laquelle vous souhaitez revenir.

11voto

Raj Points 172

Pour "désappliquer" la dernière (récente ?) migration après qu'elle ait déjà été appliquée à la base de données :

  1. Ouvrir l'explorateur d'objets du serveur SQL (View -> "SQL Server Object Explorer")
  2. Naviguez vers la base de données qui est liée à votre projet en développant les petits triangles sur le côté.
  3. Développez les "Tables".
  4. Trouvez la table nommée "dbo._EFMigrationsHistory".
  5. Faites un clic droit dessus et sélectionnez "View Data" pour voir les entrées du tableau dans Visual Studio.
  6. Supprimez la ligne correspondant à la migration que vous voulez annuler (dites "oui" à l'avertissement, si vous y êtes invité).
  7. Exécutez à nouveau "dotnet ef migrations remove" dans la fenêtre de commande dans le répertoire qui contient le fichier project.json. Vous pouvez également exécuter la commande "Remove-Migration" dans la console du gestionnaire de paquets.

J'espère que cela vous aidera et que c'est applicable à toutes les migrations du projet... Je l'ai testé uniquement sur la migration la plus récente...

Bon codage !

24 votes

Cela n'annulera pas réellement la migration, mais fera simplement croire au framework qu'elle n'a pas été appliquée. Votre base de données sera dans un état incohérent si vous faites cela.

1 votes

Modifier manuellement les données dans votre __EFMigrationsHistory est un conseil terrible. Ne le faites pas. Cette table est uniquement destinée à être utilisée sous le capot par les outils de migration. Si vous commencez à modifier manuellement les données, une seule erreur peut créer toutes sortes de comportements inattendus dans votre projet. Il est bien plus judicieux d'utiliser l'une des autres solutions recommandées.

0 votes

Nous avons eu une situation où un membre junior de l'équipe s'est embrouillé en changeant de branche, et a fini par supprimer la migration manuellement des deux (bien qu'elle soit toujours dans la table __EFMigrationsHistory puisqu'elle a déjà été appliquée), donc nous avons perdu le "bas". C'est ce que nous avons fini par devoir faire, plus quelques inversions manuelles dans SSMS. Ne le faites donc pas - sauf si vous n'avez pas d'autre choix à ce stade. Au moins, il n'a fait qu'ajouter un seul nouveau champ.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X