web-dev-qa-db-fra.com

Comment mettre à jour un fichier edmx avec les modifications de la base de données?

J'ai un fichier edmx et j'ai changé une table dans ma base de données. Je sais qu'il existe un assistant "Mise à jour du modèle à partir d'une base de données", mais dans de nombreux cas, cela est inutile.

Par exemple, si je modifie un champ de null null en nullable ou si je supprime des champs, le modèle de mise à jour ne reflète pas les modifications. J'ai dû supprimer l'entité et la rajouter pour que les modifications apparaissent dans mon modèle.

Pour la question suivante: Comment propager les modifications de la base de données dans mon fichier .edmx?

L'une des réponses semble dire la même chose, à savoir que vous devez supprimer l'entité et la rajouter.

Est-ce la réponse définitive ou existe-t-il un meilleur moyen de le faire?

41
dtc

Une première étape importante consiste à comprendre exactement ce qui se passe lorsque vous utilisez l'assistant de mise à jour de modèle.

Depuis la Bibliothèque MSDN :

Le concepteur de modèle de données ADO.NET Entity (Entity Designer) utilise le modèle de mise à jour Wizard pour mettre à jour un fichier .edmx à partir des modifications apportées à la base de données. Le modèle de mise à jour Wizard écrase le modèle de stockage dans le cadre de ce processus. Le modèle de mise à jour Wizard apporte également des modifications au modèle conceptuel et aux mappages, mais il ne les effectue que lorsque des objets sont ajoutés à la base de données. Par exemple, de nouveaux types d'entité sont ajoutés au modèle conceptuel lorsque des tables sont ajoutées à la base de données, et de nouvelles propriétés sont ajoutées aux types d'entité lorsque des colonnes sont ajoutées à une table. Pour plus d'informations sur les modifications apportées au fichier .edmx, voir Modifications apportées à un fichier .edmx par le modèle de mise à jour Wizard .

Lorsque vous avez mis à jour la base de données à l'aide de l'assistant de mise à jour, il a mis à jour le modèle de stockage dans le fichier .edmx et non le modèle conceptuel. Lorsque des modifications sont apportées à la définition des objets existants, seul le modèle de stockage est mis à jour. le modèle conceptuel n'est pas mis à jour. Pour une description complète des modifications apportées par l'assistant de mise à jour de modèle, veuillez consulter le lien "Modifications apportées à un fichier .edmx par l'assistant de mise à jour de modèle" ci-dessus.

Voici quelques options sur la façon de mettre à jour des objets qui ne sont pas mis à jour par l'assistant de mise à jour de modèle (en fonction de votre scénario dans lequel la définition de la colonne a été modifiée):

  1. Utilisez l'assistant de mise à jour de modèle (pour mettre à jour le modèle de stockage), ouvrez le fichier .edmx à l'aide du concepteur (par défaut), recherchez la propriété scalaire souhaitée et modifiez les propriétés souhaitées dans les fenêtres Propriétés.
  2. Utilisez l'assistant de mise à jour de modèle (pour mettre à jour le modèle de stockage), ouvrez le fichier .edmx à l'aide de l'éditeur XML, recherchez la propriété souhaitée dans la section CSDL (modèle conceptuel) et modifiez les attributs souhaités. C'est en gros la même chose que l'option 1, mais vous éditez directement le XML (une recherche et un remplacement peuvent être utiles ici).
  3. Dans le navigateur de modèles, supprimez l'entité souhaitée de la section Types d'entité du modèle conceptuel et le tableau souhaité de la section Tables/Vues du modèle de stockage. Puis utilisez l’assistant de mise à jour du modèle pour le rajouter.

La meilleure option dépend du scénario donné. Par exemple, si vous venez de modifier la définition d'une colonne, l'option 1 est probablement votre meilleur choix. Si vous avez modifié la définition d'un certain nombre de colonnes dans une seule table, l'option 3 pourrait alors s'avérer votre meilleur choix. Si vous avez modifié une colonne utilisée dans plusieurs tables (telle qu'une clé primaire/étrangère), la modification directe du fichier XML .edmx peut s'avérer votre meilleure option.

34
timb

Mettre à jour un EDMX à la manière safe:

Comme vous l'avez constaté, la mise à jour à partir de la base de données ne modifie pas toujours les propriétés existantes correctement.

Pour notre utilisation quotidienne de la mise à jour EDMX (des centaines de mises à jour sur 24 mois), je recommanderais la séquence suivante pour mettre à jour un EDMX.

Supprimer le modèle existant puis mettre à jour:

  1. Ouvrez le concepteur EDMX
  2. Ctrl-A pour tout sélectionner
  3. Touche Supprimer pour supprimer tous les modèles du concepteur
  4. IMPORTANT: Ne sauvegardez pas l'EDMX à ce stade si vous utilisez TFS pour le contrôle de source! *
  5. Maintenant, cliquez avec le bouton droit de la souris et sélectionnez "Mettre à jour le modèle à partir de la base de données" pour recréer à nouveau le modèle entier.
  6. Reconstruire le projet pour propager les modifications

Cela va évidemment perdre tous les réglages manuels que vous avez apportés au modèle, mais les ajustements manuels doivent être évités si possible. Cela rend le processus complet reproductible à tout moment (ce qui est une bonne chose).

Notes IMPORTANTES:

  • Si la sauvegarde automatique est activée dans Visual Studio, vous devez sélectionner la mise à jour (étape 5 ci-dessus), rapidement pour éviter une sauvegarde automatique tout enregistrer.
  • Si vous utilisez TFS pour le contrôle de source et que vous enregistrez l'EDMX après l'avoir vidé, TFS marquera tous les fichiers générés comme "supprimés" et une nouvelle mise à jour d'EDMX peut entraîner des fichiers déconnectés qui ne sont pas dans le contrôle de source!.
  • Ce processus ne mettra pas à jour les procédures stockées. De plus, j'ai constaté qu'une actualisation d'un EDMX ne mettrait pas non plus à jour les procédures stockées lorsque seul le type de retour a changé (toujours en vigueur à partir de EF 6.1.1).

Recommandation additionnelle:

Conservez votre EDMX dans une bibliothèque séparée. Cela devient également un excellent endroit pour ajouter des fichiers TT supplémentaires et des classes partielles (par exemple, pour étendre la fonction des modèles EDMX). Je place également toutes les méthodes d'extension pour le contexte de base de données dans cette bibliothèque. Les fichiers migration sont également générés dans la bibliothèque, ce qui le maintient bien contenu.

Mise à jour avril 2015

La dernière version 4 de Visual Studio 2013 semble avoir résolu un grand nombre de problèmes liés à TFS. Nous voyons maintenant les fichiers générés à la caisse de Visual Studio, puis les rétablissons s’ils ne sont pas modifiés. Les étapes ci-dessus semblent toujours être l'approche la plus sûre.

Mise à jour septembre 2015

En utilisant la dernière version 5 de VS2013, nous avons toujours des problèmes si une sauvegarde est effectuée pendant la mise à jour EDMX. Vous pouvez toujours vous retrouver dans un état où des suppressions en attente entraînent que vos fichiers tt soient supprimés du contrôle de source lors de la mise à jour. Le secret est de mettre à jour rapidement entre les étapes 4 et 5! :)

55
Gone Coding

Si je comprends votre question et votre exemple, une fois que vous avez effectué l'étape de mise à jour du modèle à partir de la base de données et que vous êtes assis sur le diagramme Model.edmx, vous pouvez mettre en surbrillance la propriété de la classe que vous souhaitez modifier et afficher les propriétés correspondantes. et remplacez la propriété Nullable par Nullable: True. C'est au moins une façon de faire ça.

Je crois que l’idée ici est que le modèle conceptuel (qui ne change pas de non-null à nullable) peut en réalité différer de la table de base de données sous-jacente et qu’il ne change donc pas cette partie et que la différence peut correspondre exactement à ce que vous souhaitez. Les deux manières dont je gère ceci sont soit de supprimer et d'ajouter comme vous l'avez mentionné, soit plus généralement, je définis manuellement les propriétés comme je l'ai mentionné.

1
itsmatt

Considérez que j'ai ajouté une nouvelle colonne (c1) à ma table existante. Ensuite, pour mettre à jour la même chose dans mon modèle d'entité existant, procédez comme suit.

Je vais ouvrir le fichier .edmx dans Notepad ++.

Je vais ajouter la propriété c1 au fichier .edmx si nécessaire. Par exemple, j'ajouterais un noeud c1 sous chaque noeud c0.

    <EntityType Name="table">
      <Key>
        <PropertyRef Name="Id" />
      </Key>
      <Property Name="Id" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
      <Property Name="c0" Type="nvarchar(max)" />
      <Property Name="c1" Type="nvarchar(max)" />
    </EntityType> 

Rechargez le projet dans Visual studio.

Et enfin, ajoutez l'attribut c1 au modèle.

1
Siddarth Kanted

Étape 1: Double-cliquez sur .edmx fichier. (La fenêtre du diagramme s'ouvrira)

Étape 2: Dans la fenêtre du diagramme, faites un clic droit et sélectionnezMettre à jour le modèle à partir de la base de données ...

Étape 3: Cliquez avec le bouton droit de la souris sur Model.tt file et cliquez surExécuter la personnalisation en trop l

C'est tout!

0
Chandan Y S
  1. Tout d'abord, double-cliquez sur le fichier .edmx
  2. Deuxièmement, faites un clic droit sur l'espace vide et sélectionnez "Update Model From Database"
  3. Troisièmement, sélectionnez l'onglet Actualiser dans la barre de menus.
  4. Enfin, sélectionnez la table que vous souhaitez actualiser et sélectionnez Terminer.
0
adi sinha