Comment recréer la base de données pour Entity Framework?


143

Je suis dans un mauvais état avec mon projet ASP.Net MVC 5, en utilisant Code-First Entity Framework. Je me fiche de perdre des données, je veux juste pouvoir repartir à zéro, recréer la base de données et commencer à utiliser les migrations Code-First.

Actuellement, je suis dans un état où chaque tentative de mise à jour de la base de données entraîne la levée d'une exception ou l'obtention d'un message d'erreur. De plus, le site Web ne peut pas accéder correctement à la base de données. Comment puis-je effacer toutes les migrations, recréer la base de données et recommencer à zéro sans avoir à créer un nouveau projet? En d'autres termes, je souhaite conserver mon code mais supprimer la base de données.

Plus tard, je souhaiterai également synchroniser la base de données de déploiement (SQL Server sur Azure). Encore une fois, cela ne me dérange pas de laisser tomber toutes les données - je veux juste que cela fonctionne.

Veuillez fournir toutes les étapes pour revenir à un état propre. Très appréciée.


TBH si vous voulez simplement DROP DATABASEalors ....
Worthy7

Réponses:


209

Suivez les étapes ci-dessous:

1) Accédez d'abord à l'Explorateur de serveurs dans Visual Studio, vérifiez si les connexions de données ".mdf" pour ce projet sont connectées, si tel est le cas, cliquez avec le bouton droit et supprimez.

2) Accédez à l'Explorateur de solutions, cliquez sur Afficher l'icône Tous les fichiers.

3) Allez dans App_Data, faites un clic droit et supprimez tous les fichiers ".mdf" de ce projet.

4) Supprimez le dossier Migrations par un clic droit et supprimez.

5) Allez dans SQL Server Management Studio, assurez-vous que la base de données de ce projet n'est pas là, sinon supprimez-la.

6) Accédez à la console du gestionnaire de package dans Visual Studio et tapez:

  1. Enable-Migrations -Force
  2. Add-Migration init
  3. Update-Database

7) Exécutez votre application

Remarque: à l'étape 6 partie 3, si vous obtenez une erreur «Impossible de joindre le fichier ...», c'est peut-être parce que vous n'avez pas complètement supprimé les fichiers de base de données dans SQL Server.


Excellent! Cela a fonctionné, merci! Très utile en effet. Les étapes sont-elles similaires pour recréer la base de données de déploiement (Azure SQL)?
Toby Sharp

salut @TobySharp, pas de problèmes. Si vous n'avez aucune donnée dans votre base de données, vous pouvez suivre ces étapes, mais si vous avez des données, les étapes ne sont pas tout à fait les mêmes.
Lin

Je n'ai aucune donnée à conserver.
Toby Sharp

3
Mettre à jour, si vous supprimez de VS (comme le disent les instructions) et non de l'Explorateur Windows, cela fonctionne. De plus, si vous n'avez pas SQL Management Studio, vous pouvez utiliser l'Explorateur d'objets SQL dans VS pour supprimer d'une base de données locale.
Mike Ward

3
Si vous obtenez l'erreur "Impossible de joindre le fichier ...", même si vous pensez avoir tout supprimé, essayez la réponse de ce fil de discussion: stackoverflow.com/questions/13275054/…
Andy

44

Je voudrais ajouter que la réponse de Lin est correcte.

Si vous supprimez incorrectement le MDF, vous devrez le réparer. Pour fixer les connexions vissées du projet au MDF. Réponse courte; recréez-le et supprimez-le correctement.

  1. Créez un nouveau MDF et nommez-le comme l'ancien MDF, placez-le dans le même emplacement de dossier. Vous pouvez créer un nouveau projet et créer un nouveau mdf. Le mdf ne doit pas nécessairement correspondre à vos anciennes tables, car nous allions le supprimer. Alors créez ou copiez un ancien dans le bon dossier.
  2. Ouvrez-le dans l'explorateur de serveur [double-cliquez sur le mdf de l'explorateur de solutions]
  3. Supprimez-le dans l'explorateur de serveur
  4. Supprimez-le de l'explorateur de solutions
  5. exécuter update-database -force [Utiliser la force si nécessaire]

Terminé, profitez de votre nouvelle base de données

MISE À JOUR 12/11/14 - J'utilise cela tout le temps quand je fais un changement de db de rupture. J'ai trouvé que c'était un excellent moyen de restaurer vos migrations vers la base de données d'origine:

  • Remet la base de données à l'original
  • Exécutez la migration normale pour la remettre à l'état actuel

    1. Update-Database -TargetMigration:0 -force [Cela détruira toutes les tables et toutes les données.]
    2. Update-Database -force [utiliser la force si nécessaire]

1
Très heureux de vous aider ... Je vais mettre à jour ma réponse. J'ai récemment trouvé un meilleur moyen d'annuler toutes les modifications.
Steve Coleman

8

Cela a fonctionné pour moi:

  1. Supprimer la base de données de l'Explorateur d'objets SQL Server dans Visual Studio. Cliquez avec le bouton droit et sélectionnez Supprimer.
  2. Supprimez les fichiers mdf et ldf du système de fichiers - s'ils sont toujours là.
  3. Reconstruire la solution.
  4. Démarrer l'application - la base de données sera recréée.

1
Oui, tout ce que j'avais à faire était de supprimer le MDF, de mettre à jour la chaîne de connexion dans le web.config, puis d'exécuter l'application et d'enregistrer un nouveau compte. Il a créé à nouveau toutes les tables dans la nouvelle base de données automatiquement.
Dan Bechard

3

Bien que cette question soit fondée sur le fait de ne pas se soucier des données, la maintenance des données est parfois essentielle.

Si tel est le cas, j'ai écrit une liste d'étapes sur la façon de récupérer du cauchemar d'Entity Framework lorsque la base de données contient déjà des tables du même nom ici: Comment récupérer du cauchemar d'Entity Framework - la base de données a déjà des tables du même nom

Apparemment ... un modérateur a jugé bon de supprimer mon message, je vais donc le coller ici:

Comment récupérer du cauchemar Entity Framework - la base de données a déjà des tables avec le même nom

Description : Si vous êtes comme nous lorsque votre équipe est nouvelle dans EF, vous vous retrouverez dans un état dans lequel vous ne pouvez pas créer une nouvelle base de données locale ou vous ne pouvez pas appliquer de mises à jour à votre base de données de production. Vous voulez revenir à un environnement EF propre, puis vous en tenir aux bases, mais vous ne pouvez pas. Si vous le faites fonctionner pour la production, vous ne pouvez pas créer une base de données locale, et si vous le faites fonctionner pour le local, votre serveur de production se désynchronise. Et enfin, vous ne souhaitez supprimer aucune donnée du serveur de production.

Symptôme : impossible d'exécuter Update-Database car il essaie d'exécuter le script de création et la base de données contient déjà des tables portant le même nom.

Message d'erreur: System.Data.SqlClient.SqlException (0x80131904): il existe déjà un objet nommé «» dans la base de données.

Contexte du problème : EF comprend où se trouve la base de données actuelle par rapport à l'endroit où se trouve le code en fonction d'une table dans la base de données appelée dbo .__ MigrationHistory. Quand il regarde les scripts de migration, il essaie de reconsidérer où il était en dernier avec les scripts. Si ce n'est pas le cas, il essaie simplement de les appliquer dans l'ordre. Cela signifie qu'il revient au script de création initial et si vous regardez la toute première partie de la commande UP, ce sera le CreeateTable de la table sur laquelle l'erreur s'est produite.

Pour comprendre cela plus en détail, je vous recommande de regarder les deux vidéos référencées ici: https://msdn.microsoft.com/en-us/library/dn481501(v=vs.113).aspx

Solution : ce que nous devons faire est de faire croire à EF que la base de données actuelle est à jour sans appliquer ces commandes CreateTable. Dans le même temps, nous voulons toujours que ces commandes existent afin de pouvoir créer de nouvelles bases de données locales.

Étape 1: Nettoyage de la base de données de production Tout d'abord, effectuez une sauvegarde de votre base de données de production. Dans SSMS, cliquez avec le bouton droit de la souris sur la base de données, sélectionnez "Tâches> Exporter l'application au niveau des données ..." et suivez les invites. Ouvrez votre base de données de production et supprimez / supprimez la table dbo .__ MigrationHistory.

Étape 2: Nettoyage de l'environnement local Ouvrez votre dossier de migrations et supprimez-le. Je suppose que vous pouvez tout récupérer de git si nécessaire.

Étape 3: recréer l'initiale Dans le gestionnaire de package, exécutez «Enable-Migrations» (EF vous invitera à utiliser -ContextTypeName si vous avez plusieurs contextes). Exécutez "Add-Migration Initial -verbose". Cela créera le script initial pour créer la base de données à partir de zéro en fonction du code actuel. Si vous aviez des opérations d'amorçage dans la configuration.cs précédente, copiez-la dans l'ensemble.

Étape 4: Trick EF À ce stade, si nous exécutions Update-Database , nous obtiendrions l'erreur d'origine. Nous devons donc inciter EF à penser qu'il est à jour, sans exécuter ces commandes. Alors, allez dans la méthode Up dans la migration initiale que vous venez de créer et commentez tout.

Étape 5: Update-Database En l'absence de code à exécuter sur le processus Up, EF créera la table dbo .__ MigrationHistory avec l'entrée correcte pour indiquer qu'il a exécuté ce script correctement. Allez le vérifier si vous le souhaitez. Maintenant, décommentez ce code et enregistrez-le. Vous pouvez réexécuter Update-Database si vous souhaitez vérifier qu'EF pense qu'il est à jour. Il n'exécutera pas l'étape Up avec toutes les commandes CreateTable car il pense que c'est déjà fait.

Étape 6: Confirmez qu'EF est RÉELLEMENT à jour Si vous aviez du code auquel aucune migration n'avait encore été appliquée, voici ce que j'ai fait ...

Exécutez "Add-Migration MissingMigrations" Cela créera pratiquement un script vide. Comme le code était déjà là, il y avait en fait les commandes correctes pour créer ces tables dans le script de migration initial, donc je viens de couper le CreateTable et les commandes de dépôt équivalentes dans les méthodes Up et Down.

Maintenant, exécutez à nouveau Update-Database et regardez-le exécuter votre nouveau script de migration, en créant les tables appropriées dans la base de données.

Étape 7: Re-confirmez et validez. Construisez, testez, exécutez. Assurez-vous que tout fonctionne, puis validez les modifications.

Étape 8: Faites savoir au reste de votre équipe comment procéder. Lorsque la prochaine personne se met à jour, EF ne saura pas ce qui l'a frappé étant donné que les scripts qu'il avait exécutés auparavant n'existent pas. Mais, à supposer que les bases de données locales puissent être époustouflées et recréées, tout cela est bien. Ils devront supprimer leur base de données locale et ajouter à nouveau la création à partir d'EF. S'ils avaient des modifications locales et des migrations en attente, je leur recommanderais de créer à nouveau leur base de données sur le maître, de basculer vers leur branche de fonctionnalités et de recréer ces scripts de migration à partir de zéro.


1

Je veux juste ajouter à l'excellente réponse de @Lin:

5) B. Si vous n'avez pas SQL Management Studio, allez dans "Explorateur d'objets SQL Server". Si vous ne pouvez pas voir votre base de données de projet dans la base de données locale "Explorateur d'objets SQL Server", cliquez sur le bouton "Ajouter un serveur SQL" pour l'ajouter manuellement à la liste. Ensuite, vous pouvez supprimer la base de données de la liste.


Si vous souhaitez ajouter quelque chose à une réponse, veuillez ajouter un commentaire à cette réponse plutôt que de publier une nouvelle réponse.
Oliver

1
Je n'étais pas au courant de cela. Alors maintenant, vous pouvez déplacer votre réponse dans un commentaire et supprimer cette réponse car techniquement, ce n'est pas une réponse (complète) à la question :-)
Oliver

0

Une solution possible très simple qui a fonctionné pour moi. Après avoir supprimé toutes les références de base de données et les connexions que vous trouvez dans l'explorateur de serveurs / objets de serveur, cliquez avec le bouton droit sur le dossier App_Data (n'affiche aucun objet dans l'application pour moi) et sélectionnez Ouvrir. Une fois ouvert, mettez toute la base de données / etc. fichiers dans un dossier de sauvegarde ou si vous avez le courage de les supprimer. Exécutez votre application et elle devrait tout recréer à partir de zéro.


0

Ma solution est la mieux adaptée pour :
- supprimer votre fichier mdf
- vouloir recréer votre db.

Afin de recréer votre base de données, vous devez ajouter la connexion à l'aide de Visual Studio.

Étape 1 : Accédez à l'Explorateur de serveurs pour ajouter une nouvelle connexion (ou recherchez une icône d'ajout de base de données).

Étape 2 : Remplacez la source de données par un fichier de base de données Microsoft SQL Server .

Étape 3 : ajoutez le nom de la base de données de votre choix dans le champ Nom du fichier de la base de données (de préférence le même nom que celui que vous avez dans l' attribut web.config AttachDbFilename )

Étape 4 : cliquez sur Parcourir et accédez à l'endroit où vous souhaitez qu'il se trouve.

Étape 5 : dans la commande d'exécution de la console du gestionnaire de packagesupdate-database

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.