web-dev-qa-db-fra.com

Ajout d'une nouvelle colonne à une table existante dans Entity Framework

J'ai ajouté une nouvelle colonne à une table de ma base de données. La table est déjà définie dans le modèle Entity Framework existant. J'ai parcouru la plupart des questions sur la façon de procéder, mais cela échoue toujours. 

Un peu d’arrière-plan, ce modèle d’entité n’a pas été mis à jour depuis au moins 3 ans. Donc, mis à part la colonne que j'ajoute, je sais qu'un certain nombre d'autres colonnes ont été ajoutées à cette époque, mais n'ont jamais été incluses. J'ai repris le projet il y a environ 9 mois et je n'ai jamais réussi à mettre à jour le modèle.

Premier essai:

  • Ouvert le modèle dans Visual Studio
  • Clic droit sur le fond
  • Cliqué sur "Mettre à jour le modèle à partir de la base de données ..."
  • Cliqué sur l'onglet Actualiser
  • Tables sélectionnées
  • Surligné le tableau spécifique
  • Cliqué sur Terminer

Résultat:  

  • Les classes pour des dizaines de tables de mon modèle ont été supprimées.
  • La table en question n'a pas été mise à jour

Deuxième essai

  • Restauré toutes les sources
  • Comme ci-dessus mais
  • Après avoir ouvert l'assistant de mise à jour, cliquez sur l'onglet Supprimer.
  • Tables sélectionnées
  • Cliqué sur Terminer
  • Toutes les tables ont été supprimées
  • Enregistré le modèle EF/fermé/ouvert il
  • Retourné à l'onglet Mettre à jour Wizard]
  • Tables cliquées
  • Aucune de mes tables n'était affichée lorsque j'ai tout développé
  • Cochez la case au niveau des tables

Résultat

  • Aucune de mes tables n'a été rajoutée, mais tout ce qui n'était pas Inclus à l'origine a été ajouté

Troisième tentative

  • Restauré toutes les sources
  • Supprimé les deux fichiers .tt
  • Ouvert l'assistant de mise à jour
  • Cliqué sur Ajouter pour tout

Résultat

  • Rien n'a été recréé, pas de fichiers .tt ou quoi que ce soit d'autre.

Quatrième tentative

  • Source restaurée
  • Tableau supprimé du modèle EF
  • Assistant de mise à jour ouvert
  • Cliqué sur Ajouter des tables

Résultats

  • Les classes pour des dizaines de tables de mon modèle ont été supprimées.
  • La table en question n'a pas été rajoutée

Dernière tentative

  • Entité ajoutée manuellement au modèle

Résultat

  • Coder tous les éléments compilés et exécutés, mais les valeurs n'ont jamais été extraites de la base de données ni mises à jour

Toute aide ou direction qui pourrait être fournie serait grandement appréciée car je suis à un point critique et je dois mettre le modèle à jour.

9
Rodney Buxton

Le "modèle de mise à jour à partir de la base de données" est difficile/lent à utiliser et est sujet aux erreurs. Cela génère d'autres choses que vous ne voulez probablement pas/dont vous n'avez pas besoin. Donc, ajouter manuellement la colonne dont vous avez besoin fonctionnera mieux. Je vous suggère de le faire en dehors de l'éditeur VS car, selon le nombre de modèles/tables, l'ouverture du fichier peut être très lente. 

 1. So in Windows Exlorer,right click on the *.edmx file and open with Notepad (or Notepad++/Textpad).

 2. Search for the text <EntityType Name="YourTableNameToAddColumn">.

 3. Add the property <Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />

 4. Search for the text <MappingFragment StoreEntitySet="YourTableNameToAddColumn">

 5. Add mapping to the new column <ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>

 6. Save the *.edmx file
16
alltej

Un addendum à la réponse de alltej ci-dessus et à la réponse de Chris Walsh indiquant qu'il reçoit "Le côté conceptuel membre ou propriété" xxxxx "spécifié dans le cadre de ce MSL n'existe pas dans MetadataWorkspace.

Vous devez vous assurer que vous recherchez 'Ajouter la propriété' dansDEUXendroits dans votre fichier .edmx, sinon vous obtiendrez l'erreur de Chris

6
Ken.Fukizi

1.Alors dans Windows Exlorer, faites un clic droit sur le fichier * .edmx et ouvrez-le avec Notepad (ou Notepad ++/Textpad).

2.Rechercher le texte <EntityType Name="YourTableNameToAddColumn">.

3.Ajouter la propriété <Property Name="YourNewColumnName" Type="varchar" MaxLength="64" />.

4.Recherchez à nouveau le texte <EntityType Name="YourTableNameToAddColumn">, il y en a un deuxième.

5.Ajouter la propriété <Property Name="YourNewColumnName" Type="varchar" MaxLength="64" /> à elle.

6.Rechercher le texte <MappingFragment StoreEntitySet="YourTableNameToAddColumn">.

7.Ajoutez un mappage à la nouvelle colonne <ScalarProperty Name="YourNewColumnName" ColumnName="YourNewColumnName"/>.

8.Enregistrez le fichier * .edmx

9. Ensuite, mettez à jour le modèle edmx de votre table public string YourNewColumnName { get; set; }

1
Nestoras Rose

Compris le problème. Lorsque j'ai généré le modèle, l'erreur 113: la multiplicité n'est pas valide dans le rôle. Je ne l'ai pas remarqué parmi les autres erreurs 16307 générées lorsque la création a échoué. Une fois que j'ai résolu que tout fonctionnait bien.

Merci

1
Rodney Buxton

ATTENTION: Si vous ne pouvez pas supprimer votre base de données, NE PAS suivre ces étapes!

J'utilise Visual Code (.net 2) . Voici comment je l'ai résolu:

Tout d'abord, supprimez votre base de données:

dotnet ef database drop

Ensuite, supprimez toutes les migrations:

dotnet ef migrations remove

Exécutez la même commande jusqu'à tous les migrations sont supprimées!

Ajoutez votre première migration:

dotnet ef migrations add InitialCreate

Après avoir exécuté la commande ci-dessus, assurez-vous d’apporter les modifications au nouveau fichier généré, probablement dans le fichier Data/Migrations: horodatage + InitialCreate _ ​​pas le fichier de conception}. 

Exemple d'image: Ajout d'une nouvelle colonne

Après avoir ajouté vos colonnes et que tout soit cohérent, enregistrez le projet et exécutez la commande suivante:

dotnet ef database update

Si tout va bien, votre nouvelle colonne sera créée.

0
LAT94