web-dev-qa-db-fra.com

"Update Model from Database" ne voit pas de changement de type

J'ai plusieurs colonnes que j'ai modifiées d'Int en BigInt.

J'ouvris mon modèle EF et fis une "Mise à jour du modèle à partir d'une base de données" et m'attendais à voir ces colonnes maintenant être Int64. Mais ce sont toujours des Int32.

(Je l'ai couru plusieurs fois pour être sûr.)

J'ai vérifié deux fois ma base de données et les colonnes sont bien BigInts.

Alors ... Est-ce que 'Update Model from Database' ne fonctionne pas pour un changement de type de données? Doit-il être appliqué manuellement?

22
Vaccano

Malheureusement, vous devrez supprimer les éléments de votre modèle, puis les rajouter - du moins, c’est la seule chose que j’ai réussi à faire fonctionner.

Il existe au moins un outil tiers censé vous aider, mais vous ne l'avez pas essayé personnellement.

42
E.J. Brennan

J'utilise VS2008 SP1. Si vous modifiez le type de données dans le "ModelView" (CSDL) de edmx, des erreurs se produiront car le "DatabaseModel" (SSDL) n'est pas mis à jour. Vous devez éditer le * .edmx manuellement (XML). C'est pas si difficile que ça en a l'air. Vous pouvez simplement rechercher la propriété que la "liste d'erreurs" de VS vous fournit (la recherche dans des fichiers est peut-être la meilleure solution pour cela). Accédez à la ligne où le type de données incorrect apparaît et corrigez-le.

par exemple. vous avez changé float en nvarchar (50) dans la base de données -> accédez à votre modèle et remplacez Double par String -> validate -> Error .... -> Recherchez la propriété et apportez les modifications suivantes:

      <Property Name="YourChangedProperty" Type="float" />

à

      <Property Name="YourChangedProperty" Type="nvarchar" MaxLength="50" />

Cela fonctionne très bien si vous savez exactement ce que vous avez changé dans la base de données. Si vous avez apporté d'innombrables modifications, vous devrez analyser vos modifications avec un outil de comparaison de base de données ou régénérer l'ensemble du modèle. 

Pas très gentil. Mais cela "fonctionne".

prendre soin M

7
Mat

Réponse

Pour le scénario spécifique que vous avez mentionné, vous devrez modifier manuellement le type d'Int32 à Int64.

Cela peut être fait de différentes manières, mais la plus simple consiste probablement à ouvrir le modèle (à l'aide de l'éditeur par défaut) et à modifier le Type de la propriété de Int32 à Int64.

Explication (from 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 remplace 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 .

Pour votre scénario, il est important de noter que l’assistant de mise à jour du modèle met à jour le fichier .edmx avec vos modifications, mais uniquement avec le modèle de stockage. Lorsque des modifications sont apportées à la définition des colonnes existantes, 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.

4
timb

Correct - les types de données ne semblent pas se mettre à jour automatiquement. Vous pouvez simplement changer le type de données dans la vue Modèle à l'aide de la fenêtre Propriétés et changer le Type en Int64.

4
Michael Gattuso

Vous devez supprimer votre modèle EF, puis créer à nouveau et cela fonctionnera.

2
dev85

De plus, si vous travaillez avec MySQL sous Windows - la recréation du modèle peut également ne pas aider. Le schéma est en quelque sorte mis en cache dans MySQL. Donc, si le modèle n'est pas mis à jour même après la récréation, essayez de redémarrer le service MySQL et VS pour en être sûr. Après ce modèle devrait être mis à jour avec succès.

0
alex

C'est peut-être une question plus ancienne, mais elle est assurément toujours d'actualité, car le problème n'a pas changé. En tant que tel, je pensais offrir un résumé des recherches effectuées à ce jour sur la question, y compris certaines observations personnelles:

Cette incapacité à mettre à jour les types de données existants est inhérente, sur la base des notes jointes à la documentation de Microsoft sur le sujet, comme indiqué dans la réponse de timb. (Notez que Microsoft semble avoir déplacé ou purgé le document lié et que la documentation actuelle ne fait pas référence à ce problème, mais des notes similaires peuvent être trouvées ailleurs dans la documentation archivée. Référence ) The "Update Model from Database. .. "Assistant ne met pas à jour ces modifications, mais incombe au développeur de résoudre le problème, afin d'éviter de faire des modifications automatiques incorrectes qui pourraient théoriquement corrompre le Modèle d'une manière non voulue par le développeur.

En tant que tel, il n'y a en réalité que deux façons de résoudre le problème, sans recourir à des outils tiers:

  • Supprimez les tables concernées du modèle et rajoutez-les à l'aide de l'assistant "Mettre à jour le modèle à partir de la base de données ...", comme indiqué dans la réponse de E.J. Brennan. La faiblesse potentielle de cette méthode est qu’elle ne réussit pas toujours, en particulier si le modèle original a été généré à l’aide d’une version antérieure d’Entity Framework, ce qui peut parfois obliger le développeur à effectuer beaucoup plus de travail que nécessaire sinon pour terminer la procédure. tâche.

  • Ajustez manuellement les champs affectés à partir de la visionneuse de modèle graphique en cliquant avec le bouton droit de la souris sur le champ dans le tableau et en sélectionnant "Propriétés ..." dans le menu contextuel. REMARQUE: Do not apportez des modifications manuelles directement aux fichiers de modèle .cs à partir d'une fenêtre de code. Ces modifications seront annulées la prochaine fois que "Update Model from Database ..." l'assistant est exécuté; Si les modifications sont effectuées à partir de la visionneuse de modèle graphique, elles persisteront après la réexécution de l'assistant.

0
zarmanto