Réinitialiser les migrations Entity-Framework

299

J'ai foiré mes migrations, j'ai utilisé IgnoreChangessur la migration initiale, mais maintenant je veux 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 de Add-Migrationne pas générer de fichier complet (il est vide - car je n'ai apporté aucune modification depuis ma dernière migration, mais maintenant supprimé).

Existe-t-il une commande Disable-Migrations , afin que je puisse réexécuter Enable-Migrations?

Todd
la source
3
Une remarque importante si vous avez plusieurs chaînes de connexion: spécifiez celle à utiliser lorsque vous réinitialisez les migrations, sinon elle essaiera de s'appliquer aux deux, ce qui peut provoquer des problèmes en cas de divergences.
Jeroen Vannevel
Remarque: Si vous n'avez pas supprimé vos migrations (vous utilisez le contrôle de version à droite?), Vous pourriez avoir mis à jour votre base de données vers votre première migration, puis supprimé l'atténuation et créé de nouvelles migrations à partir de ce point. Voir ici: stackoverflow.com/a/23793384/309634
DarcyThomas

Réponses:

446

Tu dois :

  1. Supprimer l'état: supprimez le dossier des migrations de votre projet; Et
  2. Supprimez la __MigrationHistorytable dans votre base de données (peut-être sous les tables système); ensuite
  3. Exécutez la commande suivante dans la console du gestionnaire de packages:

    Enable-Migrations -EnableAutomaticMigrations -Force

    Utiliser avec ou sans -EnableAutomaticMigrations

  4. Et enfin, vous pouvez exécuter:

    Add-Migration Initial
Todd
la source
5
^^ Je l'ai compris - c'était une erreur TFS - si vous utilisez TFS, vous devez effectuer un enregistrement avant d'exécuter la commande "Enable-Migrations ...". : D
BrainSlugs83
7
Si vous n'utilisez pas le contrôle de version, enregistrez vos valeurs Seed avant de les supprimer!
RyanJMcGowan
77
@RyanJMcGowan si vous n'utilisez pas le contrôle de version, vous méritez de perdre votre travail. :-)
Mike Cole
4
@Tood. +1 à cela. Cela m'a fait gagner beaucoup de temps. Maintenant, si seulement l'équipe EF pouvait incorporer tout cela dans une commande Reset-Migrations. Peut-être EF 6 ...
Gerald Davis
24
Pour une base de données existante, vous devez commenter le contenu de la fonction "Up". Sinon, vous obtiendrez une erreur lorsque vous exécuterez "Update-Database", cela se plaindrait que la table existe déjà
Guy
149

Le problème: vous avez détruit vos migrations et vous souhaitez le réinitialiser sans supprimer vos tables existantes.

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

Que faire:

  1. Supprimez les migrations existantes de la table Migrations_History.

  2. Supprimez les migrations existantes du dossier Migrations.

  3. Exécutez la réinitialisation de l'add-migration. Cela créera une migration dans votre dossier de migration qui comprend la création des tables (mais il ne l'exécutera pas et ne générera pas d'erreur.)

  4. Vous devez maintenant créer la ligne initiale dans la table MigrationHistory pour qu'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 d'effectuer, car les tables existent déjà dans votre base de données. Alors, 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 des migrations normales.

Greg Gum
la source
11
C'est la seule réponse qui a fonctionné pour moi. La réponse acceptée ne semble pas résoudre le problème de ce qui se passe lorsque vous exécutez Update-Database ou exécutez votre application (selon le type d'initialiseur que vous utilisez). Il essaiera d'exécuter la migration et tentera d'apporter des modifications qui existent déjà. A moins que je manque quelque chose.
regularmike
2
C'est aussi la réponse qui est plus flexible. Dans mon cas, il y avait certains changements que j'avais besoin d'appliquer et d'autres non. Je pourrais juste garder les trucs utiles dans mon Up ().
tec-goblin
1
@ H.Johnson, je l'ai regardé. Avez-vous une question à ce sujet?
Greg Gum
2
Une chose à savoir, à partir d'EF 6.0, la table _MigrationsHistory contient des migrations pour plusieurs DBContexts. La suppression peut entraîner des problèmes, vous ne devez supprimer que les lignes où ContextKey = votre nom de migration. Aussi après 2 ci-dessus, j'ai dû à nouveau activer les migrations
David Waterworth
2
Essentiellement la même réponse, avec un exemple étendu (avec captures d'écran): weblog.west-wind.com/posts/2016/Jan/13/…
nmit026
30

Que diriez-vous

Update-Database TargetMigration: $InitialDatabase

dans la console du gestionnaire de packages? Il devrait réinitialiser toutes les mises à jour à son état très précoce.

Lien de référence: Code First Migrations - Migration vers une version spécifique (y compris la mise à niveau inférieure)

Chris Voon
la source
Je pense que ma principale frustration n'était plus de faire confiance aux migrations pour maintenir avec précision l'état. Et par conséquent vouloir repartir de zéro.
Todd
@Todd, j'ai trébuché et il n'était pas toujours clair si je devais supprimer les fichiers de migration pour tout recommencer. Il fonctionne maintenant comme suit: 1. revenez à l'initiale en utilisant la commande "Update-Database –TargetMigration: $ InitialDatabase". 2. Supprimez tous les fichiers de migration (nommés à l'aide de yyyyMMddHHmmssx_Name.cs ou .vb) 3. Actualisez la mise à jour en utilisant «add-Migration -Name some_name». 4. Émettez la mise à jour pour affecter votre base de données à l'aide de 'update-Database'. J'espère que ça marche pour toi.
Chris Voon
Dans mon cas, la commande suggérée dans cette réponse a entraîné des erreurs SQL.
Justin Skiles
que doit-il signifier "InitialDatabase"? supprimera-t-il les tables ou colonnes déjà créées dans la base de données?
Serge
16

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

  1. Supprimez tous les fichiers * .cs du dossier Migrations.

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

  3. Courir Enable-Migrations -EnableAutomaticMigrations -Force

  4. Courir Add-Migration Reset

Ensuite, dans la public partial class Reset : DbMigrationclasse, vous devez commenter toutes les tables existantes et actuelles:

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

Si vous manquez ce bit, tout échouera et vous devrez recommencer!

  1. Now Run Update-Database -verbose

Cela devrait réussir si vous avez fait correctement ce qui précède, et maintenant vous pouvez continuer comme d'habitude.

clou rouillé
la source
2
Au lieu de tout commenter, vous pouvez aussi simplement écrire «retour»; dans la première ligne de la méthode Up ().
chainstair
6

Étant donné que cela apparaît toujours lorsque nous recherchons EF dans .NET Core, je posterai ma réponse ici (car cela m'a beaucoup hanté). Notez qu'il existe certaines subtilités avec la version EF 6 .NET (pas de commande initiale, et vous devrez supprimer les fichiers "Snapshot")

(Testé dans .NET Core 2.1)

Voici les étapes:

  1. Supprimez le _efmigrationhistorytableau.
  2. Recherchez toute votre solution pour les fichiers contenant un instantané dans leur nom, tels que ApplicationDbContextSnapshot.cs, et supprimez- les.
  3. Reconstruisez votre solution
  4. Courir Add-Migration InitialMigration

Remarque: vous devez supprimer TOUS les fichiers d'instantanés . J'ai passé d'innombrables heures à supprimer la base de données ... Cela générera une migration vide si vous ne le faites pas.

De plus, dans # 3, vous pouvez simplement nommer votre migration comme vous le souhaitez.

Voici quelques ressources supplémentaires: asp.net CORE Migrations générées vides

Réinitialiser les migrations Entity Framework 7

Jose A
la source
3

Dans EntityFramework 6, veuillez essayer:

Add-Migration Initial

afin de mettre à jour le fichier de migration initial.

Asaf
la source
3

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

mise à jour de la base de données dotnet ef

Liam Kernighan
la source
2

Mon problème s'est avéré être la suppression manuelle du dossier Migrations. Je l'ai fait parce que je voulais sauvegarder le contenu, j'ai donc simplement fait glisser le dossier hors du projet. J'ai ensuite résolu le problème en le replaçant (après avoir effectué une copie de sauvegarde), puis en supprimant le dossier Migrations en cliquant dessus avec le bouton droit dans l'Explorateur de solutions et en choisissant Supprimer dans le menu contextuel.

John Deighan
la source
1

Dans EF6

  1. Supprimez tous vos fichiers dans le dossier 'migrations' ... Mais pas la 'création initiale' ou la 'configuration'.
  2. Supprimez la base de données.
  3. Maintenant, courez Add-Migration Initial.
  4. Maintenant, vous pouvez mettre à jour la base de données et tout ira bien.
adudley
la source
1

Supprimez le Migrationsdossier, Cleanpuis Rebuildle projet. Cela a fonctionné pour moi. Avant de nettoyer et de reconstruire, il disait que la migration existe déjà car dans sa mémoire cache, elle n'est pas encore supprimée.

Siege21x
la source
0

Cette méthode ne nécessite pas la suppression de la __MigrationHistorytable, vous n'avez donc pas à mettre la main sur la base de données lors du déploiement.

  1. Supprimez les migrations existantes du dossier Migrations.
  2. Dans la console du gestionnaire de packages, exécutez Add-Migration ResetMigrations
  3. Nettoyer l'historique de migration dans la Up()méthode:
/// <summary>
/// Reset existing migrations by cleaning the __MigrationHistory table
/// and creating a new initial migration with the current model snapshot.
/// </summary>
public partial class ResetMigrations : DbMigration
{
    public override void Up()
    {
        Sql("DELETE FROM [dbo].[__MigrationHistory]");
    }

    public override void Down()
    {
    }
}
Olexander Ivanitskyi
la source
0

Dans Net Core 3.0:

Je n'ai pas réussi à trouver un moyen de réinitialiser les migrations .

J'ai également rencontré des problèmes avec des migrations interrompues et les réponses fournies ici n'ont pas fonctionné pour moi. J'ai une API Web .Net Core 3.0, et quelque part au cours du dernier mois, j'ai modifié la base de données directement. Oui, j'ai fait une mauvaise, mauvaise chose.

Les stratégies suggérées ici ont entraîné un certain nombre d'erreurs dans la console du gestionnaire de packages:

  • Une migration de ce nom existe déjà
  • Impossible de trouver l'instantané
  • 'Force' n'est pas un paramètre reconnu

Certes, j'ai peut-être manqué une étape ou manqué d'effacer les fichiers corrects, mais j'ai trouvé qu'il existe des moyens de nettoyer cela sans autant de force brute:

  • Remove-Migration du PMC pour chaque migration par nom, dans l'ordre inverse de la création, jusqu'à et y compris la migration interrompue
  • Add-Migration pour créer une nouvelle migration qui sera le delta entre la dernière bonne migration jusqu'au schéma actuel

Désormais, lorsque l'API Web est démarrée avec une base de données vide, elle crée correctement toutes les tables et propriétés pour correspondre aux modèles d'entité.

HTH!

greenCodeMonkey
la source
0

MISE À JOUR 2020

Add-Migration Initial -Context ApplicationDbContext

ApplicationDbContext => Votre contexte.

Diego Venâncio
la source
-3
Enable-Migrations -EnableAutomaticMigrations -Force
Debendra Dash
la source