Comment annuler une migration dans ASP.NET Core avec EF Core

180

Lorsque PM> Remove-Migration -context BloggingContextj'exécute dans VS2015 avec un projet ASP.NET Core à l'aide d'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.

nam
la source
3
essayez d'ajouter -forceà la fin
prospecteur
1
L'article learnentityframeworkcore.com/migrations#reversing-a-migration décrit les étapes. Merci @drewskis pour le lien
Michael Freidgeim
Merci @MichaelFreidgeim
Drewskis

Réponses:

215

Utilisation:

CLI

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

Console du gestionnaire de packages

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

Exemple:

PM> Update-Database MyInitialMigration

Essayez ensuite de supprimer 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 l'instantané de migration sur votre solution

adem caglin
la source
6
J'obtiens toujours la même erreur. J'ai d'abord utilisé dotnet ef database update MyFirstMigration --context BloggingContextcela a fonctionné avec succès. Ensuite, j'ai couru dotnet ef migrations remove --context BloggingContextqui m'a donné le même message d'erreur que dans mon message
nam
14
Vous devrez mettre à jour la migration avant MyFirstMigration. S'il s'agit de la première migration (comme son nom l'indique), vous pouvez utiliser dotnet ef database update 0pour annuler (annuler l'application) toutes les migrations de la base de données. Vous devriez alors pouvoir courir dotnet ef migrations remove.
bvpb
Il convient également de noter que vous ne devez utiliser que le nom de la migration, à l'exclusion du préfixe de date
structuré
2
Appel dotnet ef migrations removeaprès ça
Chamika Sandamal
Votre deuxième déclaration: "Essayez ensuite de supprimer la dernière migration" n'est pas complète dans cette réponse, veuillez dire exactement ce que vous voulez dire. supprimer le fichier de migration? exécuter une commande? ...
S.Serpooshan
125

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

dotnet ef database update 0
dotnet ef migrations remove
Ronald Ramos
la source
1
Mais vous ne souhaitez pas supprimer toutes les migrations. Par exemple, vous souhaitez conserver la migration par défaut créée par VS pour l'identité (comptes d'utilisateurs) dans le dossier Data \ Migrations.
nam
C'est bon à savoir dotnet ef database update 0, mais l'exécution dotnet ef migrations removeultérieure supprimera la migration par défaut pour Identity, ce qui pourrait ne pas être souhaité.
kimbaudi
Merci pour le tuyau dotnet ef database update 0! Je n'avais vu cela mentionné nulle part ...
Tobias J
3
@nam "Mais vous ne voulez pas supprimer toutes les migrations." Mais certains d'entre nous le font. Ne présumez pas ce que je veux :)
starmandeluxe
3
Cela n'a pas fonctionné pour moi. La première ligne était correcte et supprimait toutes les migrations, sur la deuxième ligne, je reçois toujoursThe migration '20180618103514_InitialMigration' has already been applied to the database. Revert it and try again. If the migration has been applied to other databases, consider reverting its changes using a new migration.
Ido Ran
52

Vous pouvez toujours utiliser la Update-Databasecommande.

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

Cependant, à en juger par le nom de votre migration, je suppose que c'est la première migration, de sorte que la commande peut ne pas fonctionner. Vous devriez pouvoir supprimer l'entrée de la __MigrationHistorytable de votre base de données, puis réexécuter la Remove-Migrationcommande. Vous pouvez également supprimer le fichier de migration et recommencer.

Brad
la source
Vous pouvez appeler à Update-Databasepartir de la console de gestion de package ou à dotnet ef database updatepartir de l'invite de commande depuis le répertoire du projet.
kimbaudi
7
Juste pour clarifier la réponse de Brad ici - <migration name>devrait être le nom de la migration vers laquelle vous voulez revenir (c'est- à -dire probablement la migration avant celle que vous avez ratée), pas le nom de la migration que vous voulez annuler.
Mark Amery
52

Pour annuler une ou plusieurs migrations spécifiques :

dotnet ef database update LastGoodMigrationName
or
PM> Update-Database -Migration LastGoodMigrationName

Pour annuler toutes les migrations :

dotnet ef database update 0
or
PM> Update-Database -Migration 0

Pour supprimer la dernière migration:

dotnet ef migrations remove
or
PM> Remove-Migration

Pour supprimer toutes les migrations:

supprimez simplement le Migrationsdossier.

Pour supprimer les dernières migrations (pas toutes):

Il n'y a pas de commande pour supprimer un tas de migrations et nous ne pouvons pas simplement supprimer ces quelques migrations- unes et leurs *.designer.csfichiers car nous devons conserver le fichier de capture instantanée dans un état cohérent. Nous devons supprimer les migrations une par une (voir To remove last migrationci - dessus).

Pour annuler l'application et supprimer la dernière migration:

dotnet ef migrations remove --force
or
PM> Remove-Migration -Force
AlbertK
la source
Je continue de voir le mot unapplypartout dans ces messages. Cela m'a frappé, ce n'est pas un terme technique, c'est le motun - apply
Helzgate
28

Pour annuler la dernière migration appliquée, vous devez (commandes de la console du gestionnaire de packages):

  1. Rétablir la migration depuis la base de données: PM> Update-Database <prior-migration-name>
  2. Supprimer le fichier de migration du projet (ou il sera réappliqué à l'étape suivante)
  3. Mettre à jour l'instantané du modèle: PM> Remove-Migration

UPD : la deuxième étape ne semble pas nécessaire dans les dernières versions de Visual Studio (2017).

Dmitry Polomoshnov
la source
1
Je vous remercie! Cela a parfaitement fonctionné Fasciné que parmi toutes les solutions, personne n'ait jamais mentionné la nécessité de l'étape 2.
Michael Kargl
Oui, personne n'a mentionné la deuxième étape.Merci
Ajas Aju
pas sûr de la deuxième étape, dans mon cas (dernier VS2017) le fichier de migration sera supprimé automatiquement après l'appel Remove-Migrationsans problème. Je ne suis pas sûr de ce que vous avez dit "il sera de nouveau appliqué à l'étape suivante"!
S.Serpooshan
@ S.Serpooshan En effet. Je l'ai supprimé manuellement, mais lorsque j'ai exécuté Remove-Migration, il s'est plaint que ma migration précédente avait été appliquée à la base de données. Mais ça marche.
MetalMikester
Je pense que la deuxième étape n'est nécessaire que si vous appelez dbContext.Database.Migrate()votre startup.cs
user3413723
23

Vous pouvez simplement cibler une migration par valeur

 Update-Database -Migration:0

Alors allez-y et supprimez-le

 Remove-Migration
John Nyingi
la source
1
Cela a fonctionné pour moi mais j'utilise EF et .NET core 2.0 avec VS2017
James Morrison
2
Attention: -Migration: 0 signifie revenir à l'état sans migrations. Cela effacera votre base de données
Kieren Johnstone
Oui selon la question posée. Vous pouvez incrémenter la valeur en fonction de la migration vers laquelle vous souhaitez revenir
John Nyingi
11

Pour "annuler" la migration la plus (récente?) Après qu'elle a déjà été appliquée à la base de données:

  1. Ouvrez l'Explorateur d'objets SQL Server (Affichage -> "Explorateur d'objets SQL Server")
  2. Accédez à la base de données liée à votre projet en développant les petits triangles sur le côté.
  3. Développer "Tables"
  4. Recherchez la table nommée "dbo._EFMigrationsHistory".
  5. Cliquez dessus avec le bouton droit de la souris et sélectionnez "Afficher les données" pour voir les entrées de la table dans Visual Studio.
  6. Supprimez la ligne correspondant à votre migration que vous souhaitez 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 contenant le fichier project.json. Vous pouvez également exécuter la commande "Remove-Migration" dans la console du gestionnaire de packages.

J'espère que cela aide et est applicable à toute migration dans le projet ... J'ai testé cela uniquement pour la migration la plus récente ...

Bon codage!

Raj
la source
21
Cela ne désappliquera pas réellement la migration, mais fera simplement "penser" au cadre qu'il n'a pas été appliqué. Votre base de données sera dans un état incohérent si vous faites cela.
mark.monteiro
Modifier manuellement les données de votre __EFMigrationsHistory est un conseil terrible. Ne fais pas ça. Cette table est uniquement destinée à être utilisée sous le capot par les outils de migration. Si vous commencez à éditer manuellement les données, une seule erreur peut créer toutes sortes de comportements inattendus dans votre projet. C'est une bien meilleure idée d'utiliser l'une des autres solutions recommandées.
Joe Irby
Nous avons eu une situation où un membre de l'équipe junior a été confondu avec le changement de branche et a fini par supprimer la migration manuellement des deux (même si elle était toujours dans la table __EFMigrationsHistory car elle était déjà appliquée), nous avons donc perdu le "down". C'est ce que nous avons fini par avoir à faire, plus quelques inversions manuelles dans SSMS. Alors ne le faites pas - à moins que vous n'ayez pas d'autre choix à ce stade. Au moins, il n'a fait qu'ajouter un seul nouveau champ.
Ella
10

Vous devez supprimer l' enregistrement de migration '20160703192724_MyFirstMigration' de la table '_EFMigrationsHistory' .

sinon, cette commande supprimera la migration et supprimera le dossier des migrations:

   > remove-migration -force
AminGolmahalle
la source
7

En général, si vous utilisez la console du gestionnaire de packages, la bonne façon de supprimer une migration spécifique consiste à référencer le nom de la migration

Update-Database -Migration {Name of Migration} -Context {context}

Une autre façon de supprimer la dernière migration que vous avez appliquée selon la documentation consiste à utiliser la commande:

dotnet ef migrations remove

Cette commande doit être exécutée à partir de l'invite de commande du développeur ( comment ouvrir l'invite de commande ) dans votre répertoire de solution.

Par exemple, si votre application est à l'intérieur du nom "Application" et se trouve dans le dossier c: \ Projects. Alors votre chemin devrait être:

C:\Projects\Application
Anastasios Selmanis
la source
1
La question était de savoir quoi faire si `dotnet ef migrations remove 'renvoie une erreur" La migration a déjà été appliquée à la base de données "
Michael Freidgeim
2

Afin d'annuler une migration dans EF Core 1.0, utilisez la commande:

mise à jour de la base de données dotnet ef {migration_name}

Utilisez le nom de migration de la migration jusqu'à laquelle vous souhaitez conserver vos modifications. La liste des noms de la migration peut être trouvée en utilisant:

liste des migrations dotnet ef

Rufus Lobo
la source
2

Pour annuler toutes les migrations appliquées à DB, exécutez simplement:

update-database 0

Il doit être suivi de l'exécution Remove-Migrationautant de fois qu'il y a de fichiers de migration visibles dans le répertoire de migration. La commande supprime la dernière migration et met également à jour l'instantané.

Dipendu Paul
la source
1

dans un premier temps, exécutez la commande suivante:

PM>update-database -migration:0

puis exécutez celui-ci:

PM>remove_migration

terminer

Abbas Hadavandi
la source
0
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
var roleManaget = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();

await context.Database.EnsureDeletedAsync();
Kishor Gujar
la source
-1

1. recherchez la table "dbo._EFMigrationsHistory", puis supprimez l'enregistrement de migration que vous souhaitez supprimer. 2. exécutez "remove-migration" dans PM (Package Manager Console). Travaille pour moi.

Atome
la source
Cela conduira à un état incohérent de la base de données (par exemple, une colonne est déjà supprimée)
UNeverNo