Comment mettre à jour un fichier edmx avec des modifications à 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 y a un Assistant" Update Model from database", mais dans de nombreux cas, c'est inutile.
par exemple, si je change un champ de non null à NULL ou si je supprime des champs, le modèle de mise à jour ne reflète pas les changements. J'ai dû enlever l'entité et l'ajouter dans pour obtenir les modifications apparaissent dans mon modèle.
par la question suivante: Comment puis-je propager les modifications de base de données pour mon .le dossier edmx?
l'Une des réponses que semble dire la même chose, que vous devez supprimer l'entité et de l'ajouter dans.
Est-ce la réponse définitive ou est-il une meilleure façon de le faire?
5 réponses
une première étape importante est de comprendre exactement ce qui se passe lorsque vous utilisez l'assistant de mise à jour du modèle.
De la de la Bibliothèque MSDN :
le ADO.NET Entity Data Model Designer (Entity Designer) utilise l'Assistant Update Model pour mettre à jour un .fichier edmx des modifications apportées à la base de données. L'Assistant de mise à jour du modèle écrase le modèle de stockage dans le cadre de ce processus. Le Modèle de mise à Jour de l'Assistant fait aussi quelques modifications au modèle conceptuel et aux mappages, mais il ne fait ces changements que lorsque des objets sont ajoutés à la base de données. Par exemple, de nouveaux types d'entités 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és lorsque des colonnes sont ajoutées à une table. Pour plus de détails sur ce que des modifications sont apportées à la .fichier edmx, voir modifications apportées à an .fichier edmx par L'Assistant de mise à jour du modèle .
quand vous mis à jour la base de données en utilisant l'assistant de mise à jour du modèle, il a mis à jour le modèle de stockage dans le .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 du modèle, veuillez consulter la rubrique "Modifications apportées à an .fichier edmx par le lien Update Model Wizard" ci-dessus.
Voici quelques options sur la façon de mettre à jour objets qui ne sont pas mis à jour par l'Assistant update model (basé sur votre scénario où la définition de la colonne a été modifiée):
- utilisez l'Assistant update model (pour mettre à jour le modèle de stockage), ouvrez le .edmx fichier en utilisant le concepteur (par défaut), trouver la propriété scalaire désirée et éditer les propriétés désirées dans les propriétés windows.
- utilisez l'Assistant update model (pour mettre à jour le modèle de stockage), ouvrez le .fichier edmx à l'aide de L'éditeur XML, trouvez la propriété désirée dans la section CSDL (modèle conceptuel) et modifiez les attributs désirés. C'est essentiellement la même chose que l'option 1, mais vous éditez le XML directement (un find and replace pourrait être utile ici).
- à partir du navigateur du modèle, supprimer l'entité désirée de la section Types D'entités du modèle conceptuel et la table désirée de la section Tableaux / vues du modèle de stockage. Ensuite, utilisez l'assistant de mise à jour du modèle pour l'ajouter à nouveau.
la meilleure option dépendrait du scénario donné. Par exemple, si vous venez de modifier la définition d'une colonne, alors l'option 1 est probablement votre meilleur choix. Si vous modifiez la définition d'un certain nombre de colonnes dans un seul tableau, alors l'option 3 pourrait être votre meilleur choix. Si vous avez modifié une colonne qui est utilisée à travers un certain nombre de tables (comme une clé primaire / étrangère), puis éditant le .edmx XML directement pourrait être votre meilleure option.
mise à Jour d'un EDMX safe :
comme vous l'avez constaté, la mise à jour depuis la base de données ne modifie pas toujours correctement les propriétés existantes.
de notre utilisation quotidienne de la mise à jour D'EDMX (100s de mises à jour sur 24 mois), je recommande la séquence suivante pour la mise à jour D'un EDMX.
supprimer le modèle existant, puis mettre à jour:
- Ouvrir l'EDMX designer
- Ctrl-A pour sélectionner tout
- supprimer la touche pour supprimer tous les modèles dans le concepteur
- IMPORTANT: Ne sauvegardez pas L'EDMX à ce point si vous êtes sous contrôle source!*
- cliquez maintenant avec le bouton droit de la souris et sélectionnez" Update Model from Database " pour recréer le modèle entier.
- projet de reconstruction pour propager les changements
Ce sera évidemment perdre tout manuel réglages que vous avez apportées au modèle, mais manuel réglages sont à éviter si possible. Cela rend le processus reproductible à tout moment (ce qui est une bonne chose).
Notes Importantes:
- si vous avez auto-save activé dans Visual Studio, vous devez sélectionner la mise à jour (Étape 5 ci-dessus), rapidement pour éviter un auto-save sauver tout.
- si vous êtes sous le contrôle de la source, sauvegardez L'EDMX après l'avoir vidé, votre contrôle source marquera tous les fichiers générés comme "supprimés" et la mise à jour de L'EDMX à nouveau peut entraîner des fichiers déconnectés qui ne sont pas dans le contrôle source! .
- ce processus ne mettra pas à jour les procédures stockées. De plus, j'ai constaté qu'une mise à jour D'un EDMX ne mettra pas non plus à jour les procédures stockées lorsque seul le type de retour a changé (toujours en vigueur au moment de L'EF 6.1.1).
Recommandation Supplémentaire:
Gardez votre EDMX dans une bibliothèque séparée. Cela devient également un endroit idéal 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 la base de données dans cette bibliothèque. Les fichiers migration
sont générés dans la bibliothèque, tout en gardant un bon contenu.
Mise À Jour Avril 2015
la dernière version 4 de Visual Studio 2013 semble avoir résolu beaucoup de la TSF questions. Nous voyons maintenant les fichiers générés par Visual Studio checkout, puis nous les retournons s'ils sont inchangés. Les étapes ci-dessus semble être l'approche la plus sûre.
Mise À Jour Septembre 2015
en utilisant la dernière version VS2013 de la version 5, nous avons encore des problèmes si une sauvegarde se produit lors de la mise à jour D'EDMX. Vous pouvez toujours vous retrouver dans un état où les suppressions en cours font que vos fichiers tt
sont supprimés du contrôle source pendant la mise à jour. Le secret est de mettre à jour rapidement entre les étapes 4 et 5! :)
si je comprends votre question et votre exemple, une fois que vous avez fait la mise à jour du modèle de base de données step et que vous êtes assis là sur le modèle.EDMX diagramme, vous pouvez surligner la propriété dans la classe que vous voulez changer et montrer les propriétés sur elle, et changer la propriété Nullable pour elle à Nullable: True. C'est au moins une façon de le faire.
je crois que l'idée ici est que le modèle conceptuel (qui n'est pas changé de non-nul à nul) peut effectivement diffèrent de la table de base de données sous-jacente et donc il ne change pas cette partie et cette différence pourrait être exactement ce que vous avez l'intention. Les deux façons dont je gère cela sont soit faire le supprimer & ajouter comme vous l'avez mentionné ou plus typiquement je définir manuellement les propriétés comme je l'ai mentionné.
Examiner, 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, je ferais ce qui suit.
je vais ouvrir le .fichier edmx dans notepad ++.
j'ajoute la propriété c1 à .fichier edmx où c'est nécessaire. Par exemple, je voudrais ajouter 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>
Recharger le projet dans Visual studio.
et finalement ajouter le attribut c1 au modèle.
- tout d'abord, double clic .fichier edmx
- Deuxièmement, cliquez avec le bouton droit de la souris sur l'espace vide et sélectionnez "Update Model From Database"
- Troisièmement, sélectionnez rafraîchir onglet sur la barre de menu.
- enfin, sélectionnez la table que vous voulez rafraîchir et sélectionnez Terminer..