2 votes

Ajout d'une nouvelle colonne en utilisant Update-Database dans Entity Framework Core

Peut-être que je manque quelque chose de très évident. Mais je n'ai pas été capable de trouver un moyen d'ajouter une nouvelle colonne à une table/modèle existant(e) dans EF Core.

Voici la documentation que je suis en train de suivre : https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell

Et voici ce que j'ai fait jusqu'à présent :

  1. Créé une migration en utilisant cette commande : "Add-Migration -Name CodingSoldierDbContextMigration -OutputDir Migrations -Context CodingSoldierDbContext"
  2. Mis à jour la base de données en utilisant la commande : "Update-Database -Migration CodingSoldierDbContextMigration -Context CodingSoldierDbContext". Les tables ont été créées dans la base de données.
  3. Maintenant, j'ai besoin d'ajouter une nouvelle colonne à une table existante. J'ajoute cette colonne au modèle dans le fichier .cs. Et je supprime la migration existante : "Remove-Migration -Force -Context CodingSoldierDbContext"
  4. Maintenant je ré-exécute les commandes des étapes 1 et 2. Add-Migration fonctionne et la migration est créée. Mais Update-Database échoue avec l'erreur : "Il existe déjà un objet nommé 'AspNetRoles' dans la base de données." ce qui signifie que la table est déjà présente dans la base de données, ce qui est logique.

Alors comment mettre à jour une table déjà existante ? Je pense à 2 façons :

  1. Supprimer la base de données. Créer une migration et mettre à jour la base de données. Mais toutes les données seront perdues.
  2. Ajouter une colonne dans le modèle. Mettre à jour manuellement la table en utilisant un script SQL pour ajouter la nouvelle colonne.

Mais je pense qu'il devrait y avoir une meilleure façon de faire cela.

2voto

Boney Points 890

C'est ainsi que j'ai résolu le problème. Je ne suis pas sûr que ce soit la manière parfaite.

La clé est de NE PAS supprimer la migration initiale avant de créer la nouvelle migration.

Ajout des étapes ici :

  1. Création de la migration initiale : "Add-Migration -Name CodingSoldierDbContextMigration -OutputDir Migrations -Context CodingSoldierDbContext"
  2. Mise à jour de la base de données en utilisant la commande : "Update-Database -Migration CodingSoldierDbContextMigration -Context CodingSoldierDbContext". Les tables sont créées dans la base de données.
  3. Ajout d'un nouveau champ dans l'un des modèles.
  4. Création de la migration mise à jour : "Add-Migration -Name CodingSoldierDbContextMigrationUpdated -OutputDir Migrations -Context CodingSoldierDbContext". Cette migration contiendra uniquement le code pour mettre à jour la table existante.
  5. Mise à jour de la base de données avec la migration mise à jour : "Update-Database -Migration CodingSoldierDbContextMigrationUpdated". Normalement, cela aurait dû résoudre le problème. Mais pour moi, une erreur est survenue car (d'après les journaux détaillés), il tentait de mettre à jour avec la migration initiale : "CodingSoldierDbContextMigration", je ne sais pas pourquoi.
  6. J'ai donc généré des scripts en utilisant Script-Migration : "Script-Migration -From CodingSoldierDbContextMigration -Idempotent -Output C:\MigrationScript.sql -Context CodingSoldierDbContext". Cela a généré le script qui ne contenait que les changements de la migration mise à jour. En exécutant ce script dans la base de données, la colonne a été créée et l'entrée de migration a été ajoutée dans la table "__EFMigrationsHistory".

1voto

George Johnson Points 11

J'ai rencontré un problème similaire avec EF Core et une base de données existante avec une partie du modèle complété, mais j'ajoutais un nouveau modèle (qui avait déjà une table) et j'obtenais l'erreur

Il existe déjà un objet nommé 'tableN' dans la base de données.

La façon dont j'ai résolu ce problème sur une base de données existante était :

  1. Téléchargez le dépôt
  2. Exécutez toutes les migrations jusqu'à ce qu'elles soient à jour (si vous avez une base de données avec des migrations) Si ce n'est pas le cas, créez simplement une migration initiale "dummy" et appliquez-la
  3. Créez une migration de base avant d'apporter des modifications à votre modèle/code
  4. Mettez à jour votre code avec les modifications apportées à votre base de données
  5. Créez une autre migration
  6. Supprimez la migration de base initiale
  7. update-database

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