380 votes

Réinitialisation des migrations Entity-Framework

J'ai gâché mes migrations, j'ai utilisé IgnoreChanges sur la migration initiale, mais je veux maintenant supprimer toutes mes migrations et commencer par une migration initiale avec toute la logique.

Lorsque je supprime les migrations dans le dossier et que j'essaie et Add-Migration il ne génère pas un fichier complet (il est vide - parce que je n'ai fait aucune modification depuis ma dernière migration, maintenant supprimée).

Y a-t-il un Désactiver les migrations pour que je puisse réexécuter Enable-Migrations ?

1 votes

3 votes

Une note importante si vous avez plusieurs chaînes de connexion : spécifiez laquelle utiliser lorsque vous réinitialisez les migrations, sinon elle essaiera de s'appliquer aux deux, ce qui peut causer des problèmes en cas de divergences.

0 votes

Remarque : si vous n'aviez pas supprimé vos migrations (vous utilisez le contrôle de version, n'est-ce pas ?), vous auriez pu mettre à jour votre base de données vers votre première migration, puis supprimer l'atténuation et créer de nouvelles migrations à partir de ce point. Voir ici : stackoverflow.com/a/23793384/309634

523voto

Todd Points 2386

Vous devez :

  1. Supprimez l'état : Supprimez le dossier des migrations dans votre projet ; et

  2. Supprimer le __MigrationHistory dans votre base de données (peut être sous les tables du système) ; puis

  3. Exécutez la commande suivante dans la console du gestionnaire de paquets :

    Enable-Migrations -EnableAutomaticMigrations -Force

    A utiliser avec ou sans -EnableAutomaticMigrations

  4. Et enfin, vous pouvez courir :

    Add-Migration Initial

0 votes

Bizarre. J'ai suivi ces instructions à la lettre, mais lorsque je vais faire "Enable-Migrations ..." il me dit que mon fichier Configuration.cs existe déjà... (Je regarde sur le disque avant d'exécuter cette commande, le fichier n'existe pas !)

5 votes

J'ai compris - c'était une erreur de TFS - si vous utilisez TFS, vous devez effectuer un check-in avant de lancer la commande "Enable-Migrations ...". :D

7 votes

Si vous n'utilisez pas le contrôle de version, sauvegardez vos valeurs Seed avant de les supprimer !

209voto

Greg Gum Points 1441

Le problème : Vous avez fait des erreurs dans vos migrations et vous souhaitez les réinitialiser sans supprimer vos tables existantes.

Le problème : Vous ne pouvez pas réinitialiser les migrations avec des tables existantes dans la base de données car EF veut créer les tables à partir de zéro.

Ce qu'il faut faire :

  1. Supprimez les migrations existantes de la table Migrations_History.

  2. Supprimez les migrations existantes du dossier des migrations.

  3. Exécuter add-migration Reset. Cela créera une migration dans votre dossier Migration qui inclut la création des tables (mais ne l'exécutera pas pour ne pas provoquer d'erreur).

  4. Vous devez maintenant créer la ligne initiale dans la table MigrationHistory afin que EF ait un instantané de l'état actuel. EF le fera si vous appliquez une migration. Cependant, vous ne pouvez pas appliquer la migration que vous venez de faire car les tables existent déjà dans votre base de données. Donc, allez dans la migration et commentez tout le code à l'intérieur de la méthode "Up".

  5. Maintenant, lancez update-database. Il appliquera la migration (sans modifier réellement la base de données) et créera une ligne d'instantané dans MigrationHistory.

Vous avez maintenant réinitialisé vos migrations et pouvez continuer avec les migrations normales.

19 votes

C'est la seule réponse qui a fonctionné pour moi. La réponse acceptée ne semble pas aborder la question de ce qui se passe lorsque vous exécutez Update-Database ou votre application (selon le type d'initialisateur que vous utilisez). Il tentera d'exécuter la migration et d'apporter des modifications qui existent déjà. À moins que quelque chose ne m'échappe.

2 votes

C'est aussi la réponse la plus souple. Dans mon cas, j'avais besoin d'appliquer certains changements et d'autres non. Je pouvais simplement garder les éléments utiles dans mon Up().

0 votes

34voto

Liam Kernighan Points 391

Dans Entity Framework Core.

  1. Supprimez tous les fichiers du dossier des migrations.

  2. Tapez dans la console

    dotnet ef database drop -f -v
    dotnet ef migrations add Initial
    dotnet ef database update
  3. (Ou pour la console du gestionnaire de paquets)

    Drop-Database -Force -Verbose
    Add-Migration Initial
    Update-Database

UPD : Ne faites cela que si vous ne vous souciez pas de vos données persistantes actuelles. Si vous le faites, utiliser la réponse de Greg Gum

30voto

imkheong Points 641

Et si

Update-Database –TargetMigration: $InitialDatabase

dans la console du gestionnaire de paquets ? Cela devrait réinitialiser toutes les mises à jour à leur état initial.

Lien de référence : Migrations Code First - Migration vers une version spécifique (y compris le downgrade)

0 votes

Je pense que ma principale frustration était de ne plus faire confiance aux migrations pour maintenir l'état avec précision. Et par conséquent de vouloir repartir de zéro.

1 votes

@Todd, j'ai trébuché et ce n'était pas toujours clair si je devais supprimer les fichiers de migration pour tout recommencer. Maintenant, cela fonctionne de la manière suivante : 1. revenir à la base initiale en utilisant la commande "Update-Database -TargetMigration : $InitialDatabase". 2. Supprimer tous les fichiers de migration (nommés en utilisant yyyyMMddHHmmssx_Name.cs ou .vb) 3. Rafraîchissez la mise à jour en utilisant "add-Migration -Name some_name". 4. Effectuez la mise à jour pour affecter votre base de données en utilisant 'update-Database'. J'espère que cela fonctionnera pour vous.

0 votes

Dans mon cas, la commande suggérée dans cette réponse a donné lieu à des erreurs SQL.

20voto

Chris Points 360

Pour résoudre ce problème, vous devez :

  1. Supprimez tous les fichiers *.cs dans le dossier des migrations.

  2. Supprimer la table _MigrationHistory de la base de données

  3. Exécuter Enable-Migrations -EnableAutomaticMigrations -Force

  4. Exécuter Add-Migration Reset

Ensuite, dans le public partial class Reset : DbMigration vous devez commenter tous les tableaux existants et actuels :

public override void Up()
{
// CreateTable(
// "dbo.<EXISTING TABLE NAME IN DATABASE>
// ...
// }
...
}

Si vous manquez cette étape, tout échouera et vous devrez recommencer !

  1. Cours maintenant Update-Database -verbose

Si vous avez fait ce qui précède correctement, cela devrait réussir et vous pouvez maintenant continuer comme si de rien n'était.

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