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?
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):
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.
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.
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).
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.
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.
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! :)
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é.
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.
É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!