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.


3
essayez d'ajouter -forceà la fin
prospecteur


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


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

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.


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

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).


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

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!


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

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

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


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é.


1

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

PM>update-database -migration:0

puis exécutez celui-ci:

PM>remove_migration

terminer


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

await context.Database.EnsureDeletedAsync();

-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.


Cela conduira à un état incohérent de la base de données (par exemple, une colonne est déjà supprimée)
UNeverNo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.