Cela ressemble à une tâche vraiment courante, mais je ne trouve pas de moyen facile de le faire.
Je souhaite 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, c'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 juste le nom, en sautant l'horodatage ...)
Existe-t-il un moyen plus simple?
entity-framework
entity-framework-4
database-migration
ef-migrations
Cristian Diaconescu
la source
la source
Réponses:
Depuis EF 5.0, l'approche que vous décrivez est la méthode préférée. Donc
PM> Update-Database -TargetMigration:"NameOfSecondToLastMigration"
ou en utilisant vos exemples de migrations
PM> Update-Database -TargetMigration:"CategoryIdIsLong"
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é pour cela, ou mieux encore, essayez de l'implémenter! https://github.com/dotnet/ef6
la source
dotnet ef database update LastGoodMigration
cependant, cela semble déroutant car je viens d'un arrière-plan de nœud et j'utilise knex, sequlize, ils ont une commande pour annuler la dernière modification, y a-t-il une commande pour annuler la dernière action qui a été appliquée à la base de données ?Je veux ajouter quelques clarifications à ce fil:
Ce que vous faites ci-dessus, c'est que vous souhaitez annuler toutes les migrations JUSQU'À ce que vous ayez la migration spécifiée. Ainsi, si vous utilisez GET-MIGRATIONS et que vous trouvez que vous avez A, B, C, D et E, l'utilisation de cette commande annulera E et D pour vous amener à C:
De plus, à moins que quelqu'un ne puisse commenter le contraire, j'ai remarqué que vous pouvez utiliser une valeur ordinale et le commutateur -Target court (ainsi, -Target est identique à -TargetMigration). Si vous souhaitez annuler toutes les migrations et recommencer, vous pouvez utiliser:
0, ci-dessus, annulerait même la PREMIÈRE migration ( il s'agit d'une commande destructrice - 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 qu'une migration ne soit appliquée!). 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:
ou
Modifier octobre 2019:
Selon cette réponse connexe sur une question similaire, la commande correcte est
-Target
pour EF Core 1.1 alors qu'elle l'est-Migration
pour EF Core 2.0.la source
$InitialDatabase
.ls variable:*
ressemble$InitialDatabase
simplement à une variable PowerShell définie comme 0, il n'y en a pas d'autres définies, même dans le code source EF actuel. Et, get-migrations ne renvoie rien, il écrit seulement sur la console, donc vous ne pouvez pas parcourir les objets retournés ...Dans EntityFrameworkCore :
où
20161012160749_AddedOrderToCourse
est le nom de la migration vers laquelle vous souhaitez revenir.la source
La solution est:
la source
Rappel supplémentaire:
Si vous avez plusieurs types de configuration, vous devez spécifier le [ConfigurationName]
la source
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:
la source
Avertissement : celaannulera TOUTES les migrations dans EFCore! Veuillez utiliser avec soin :)
la source
J'ai constaté que cela fonctionne lorsqu'il est exécuté dans la console du gestionnaire de packages:
dotnet ef migrations list | select -Last 2 | select -First 1 | ForEach-Object { Update-Database -Migration $_ }
Vous pouvez créer un script qui le rend plus facile.
la source
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 de contexte, par exemple:
Update-Database 201207211340509_MyMigration -context myDBcontext
(où se
201207211340509_MyMigration
trouve la migration vers laquelle vous souhaitez revenir etmyDBcontext
le nom de votre contexte de base de données)la source
Pour ce problème, je suggère ce lien:
https://elegantcode.com/2012/04/12/entity-framework-migrations-tips/
la source
Dans le cas où il y a une possibilité que dataloss EF ne termine pas la commande update-database puisque AutomaticMigrationDataLossAllowed = false par défaut, et roolback l'action à moins que vous ne l' exécutiez avec le paramètre -force .
ou
la source