Comment mettre à jour un fichier dbml Linq vers SQL?

204

Comment mettre à jour un fichier Linq to SQL .dbml?

Ante
la source

Réponses:

258

Il existe trois façons de synchroniser le modèle.

  1. Supprimez les tables modifiées du concepteur et faites-les glisser sur la surface du concepteur à partir de l'explorateur de base de données. J'ai constaté que, pour que cela fonctionne de manière fiable, vous devez:

    une. Actualisez le schéma de base de données dans l'explorateur de base de données (clic droit, actualisez)
    b. Enregistrez le concepteur après avoir supprimé les tables
    c. Enregistrez à nouveau après avoir fait glisser les tables en arrière.

    Notez cependant que si vous avez modifié des propriétés (par exemple, en désactivant la propriété enfant d'une association), cela perdra évidemment ces modifications - vous devrez les refaire.

  2. Utilisez SQLMetal pour régénérer le schéma à partir de votre base de données. J'ai vu un certain nombre de billets de blog qui montrent comment écrire ceci .

  3. Apportez des modifications directement dans le volet Propriétés du DBML. Cela fonctionne pour des modifications simples, comme autoriser des valeurs nulles sur un champ.

Le concepteur DBML n'est pas installé par défaut dans Visual Studio 2015, 2017 ou 2019. Vous devrez fermer VS, démarrer le programme d'installation VS et modifier votre installation. Les outils LINQ to SQL sont la fonctionnalité que vous devez installer. Pour VS 2017/2019, vous pouvez le trouver sous Composants individuels> Outils de code .

Robert Harvey
la source
1
J'avais essayé 1a et 1c sans 1b et recevais des erreurs «La distribution spécifiée n'est pas valide» lors d'une simple sélection sur une vue. Y compris 1b l'a corrigé pour moi
tomfumb
6
Le soutien VS a été demandé sur connect.microsoft.com/VisualStudio/feedback/details/260723/... , mais MS ne veux pas fixer.
Michael Freidgeim
J'ai essayé la première méthode et cela a fonctionné. Je suppose que cela fonctionnera pour une petite base de données.
Muhammedh
Cela me fait mal qu'à la fin de 2019, j'avais besoin d'une réponse créée avant de savoir ce qu'était la programmation informatique ... C'est tellement détaillé et génial!
PSGuy
54

Pour mettre à jour une table dans votre diagramme .dbml avec, par exemple, des colonnes ajoutées, procédez comme suit:

  1. Mettez à jour votre fenêtre SQL Server Explorer.
  2. Faites glisser la "nouvelle" version de votre table dans le diagramme .dbml (report1 dans l'image ci-dessous).

report1 est la nouvelle version du tableau

  1. Marquez les colonnes ajoutées dans la nouvelle version du tableau, appuyez sur Ctrl+ Cpour copier les colonnes ajoutées.

copier les colonnes ajoutées

  1. Cliquez sur la «vieille» version de votre tableau et appuyez sur Ctrl+ Vpour coller les colonnes ajoutées dans la version déjà présente du tableau.

collez les colonnes ajoutées dans l'ancienne version du tableau

M463
la source
4
Cela semble être la méthode la plus simple et la moins destructrice qui ne nécessite aucun outil supplémentaire et fonctionne très bien dans VS2017
Toby
1
C'est beaucoup moins intrusif que la réponse acceptée et continue de bien fonctionner fin 2018!
Mark
1
C'est la meilleure réponse pour des modifications rapides (et pas si rapides du schéma). J'ai pris beaucoup de temps à rendre la vue du modèle agréable. Je détestais supprimer et faire glisser les fichiers de mise à jour. Pour les champs ajoutés, cela fonctionne très bien!
Hucker
1
Pour moi, cela a résolu deux problèmes. Le premier a été lorsque j'ai tenté de copier et coller un champ similaire dans la table, puis de le renommer. Cela a créé une erreur de génération non spécifiée "non spécifiée" lors de la validation. L'autre problème était que si je supprimais la table, puis la rajoutais dans son intégralité, cela entraînait des différences beaucoup plus importantes dans git (car les objets étaient réorganisés dans le fichier). Avec cette méthode, je ne vois que l'insertion du nouveau champ, qui est beaucoup plus propre et plus facile à comprendre plus tard.
goug
BTW, devez cliquer sur "Oui" quand il vous invite avec "Les objets que vous ajoutez au concepteur utilisent une connexion de données différente de celle du concepteur ..."
Eitanmg
5

Vous pouvez également consulter l' ensemble PLINQO de modèles de génération de code, basé sur CodeSmith, qui vous permet de faire beaucoup de choses intéressantes pour et avec Linq-to-SQL:

  • générer un fichier par classe (au lieu d'un seul fichier volumineux)
  • mettre à jour votre modèle au besoin
  • beaucoup plus de fonctionnalités

Consultez le site PLINQO à http://www.plinqo.com et jetez un œil aux vidéos d'introduction.

Le deuxième outil que je connais sont les outils Huagati DBML / EDMX , qui permettent la mise à jour des fichiers de mappage DBML (Linq-to-SQL) et EDMX (Entity Framework), et plus (comme les conventions de dénomination, etc.).

Marc

marc_s
la source
Ayant tout juste arraché CodeSmith / PLINQO Je conseille vivement contre cette approche. Certes, cette réponse a plus de 4 ans ...
Beurk
@Yuck: à ce stade, je déconseille fortement d'utiliser Linq-to-SQL - utilisez plutôt Entity Framework, bien meilleur choix!
marc_s
Oui, ça l'est. Passer à EF après avoir vérifié que l'application fonctionnerait avec un DBML ordinaire au lieu de PLINQO était la prochaine étape que j'ai prise pour dépoussiérer une ancienne application.
Beurk
4

Nous utilisons un modèle T4 écrit personnalisé qui interroge dynamiquement le modèle information_schema pour chaque table dans tous nos fichiers .DBML, puis écrase des parties du fichier .DBML avec de nouvelles informations de schéma de la base de données. Je hautementrecommande de mettre en œuvre une solution comme celle-ci - cela m'a fait gagner beaucoup de temps, et contrairement à la suppression et à l'ajout de vos tables à votre modèle, vous gardez vos associations. Avec cette solution, vous obtiendrez des erreurs de compilation lorsque votre schéma change. Vous voulez vous assurer que vous utilisez un système de contrôle de version, car la différence est vraiment pratique. Il s'agit d'une excellente solution qui fonctionne bien si vous développez avec une première approche de schéma de base de données. Bien sûr, je ne peux pas partager le code de mon entreprise, vous êtes donc seul pour l'écrire vous-même.sur ce projet , vous pouvez arriver là où vous voulez être.

mattmc3
la source
2

Je recommanderais d'utiliser le concepteur visuel intégré à VS2008, car la mise à jour du dbml met également à jour le code généré pour vous. La modification du dbml en dehors du concepteur visuel entraînerait la désynchronisation du code sous-jacent.

Jason Miesionczek
la source
4
Oui, mais le concepteur visuel de VS2008 ne peut pas détecter et répondre aux changements dans votre base de données sous-jacente :-( À moins de supprimer et de rajouter, il n'y a pas de support pour la mise à jour de votre modèle :-(
marc_s
Bien que cela soit vrai, la question était très vague et ne mentionnait pas spécifiquement comment mettre à jour un modèle lorsque la base de données change.
Jason Miesionczek
2

Il y a une nuance à mettre à jour les tables, puis à mettre à jour le DBML ... Les relations de clé étrangère ne sont pas toujours toujours apportées si des modifications sont apportées aux tables existantes. Le travail consiste à faire une génération du projet, puis à nouveau ajouter les tables. J'ai signalé cela à MS et sa correction pour VS2010.

L'affichage DBML n'affiche pas de nouvelles contraintes de clé étrangère


Notez que les instructions données dans la réponse principale ne sont pas claires. Pour mettre à jour la table

  1. Ouvrez la surface de conception dbml
  2. Sélectionnez toutes les tables avec Droite-> Cliquez-> Sélectionner tout ou CTRLa
  3. CTRLx (Couper)
  4. CTRLv (Pâte)
  5. Enregistrez et reconstruisez la solution.
ΩmegaMan
la source
Je ne pense pas que ce soit réparé, car connect.microsoft.com/VisualStudio/feedback/details/414601/… n'est pas corrigé
Michael Freidgeim
Effectuez-vous vos modifications avant ou après le copier-coller?
Kolob Canyon
Cela fait 10 ans ... mais je crois que c'est avant ... faites les changements puis passez au # 2.
ΩmegaMan
1

Dans le cas d'une mise à jour de procédure stockée, vous devez la supprimer du fichier .dbml et la réinsérer à nouveau. Mais si la procédure stockée a deux chemins (ex: si quelque chose; affichez quelques colonnes; sinon affichez d'autres colonnes), assurez-vous que les deux chemins ont les mêmes alias de colonnes !!! Sinon, seules les premières colonnes de chemin d'accès existeront.

Yasser Hosny Abu Elmakarem
la source
0

Voici la méthode étape par étape complète qui a fonctionné pour moi afin de mettre à jour le LINQ to SQL dbml et les fichiers associés pour inclure une nouvelle colonne que j'ai ajoutée à l'une des tables de base de données.

Vous devez apporter les modifications à votre surface de conception comme suggéré par d'autres ci-dessus; cependant, vous devez effectuer quelques étapes supplémentaires. Ce sont les étapes complètes:

1. Drag your updated table from Server Explorer onto the design surface

2. Copy the new column from this "new" table to the "old" table (see M463 answer for details on this step)

3. Delete the "new" table that you just dragged over

4. Click and highlight the stored procedure, then delete it

5. Drag the new stored procedure and drop into place.

6. Delete the .designer.vb file in the code-behind of the .dbml 
   (if you do not delete this, your code-behind containing the schema will
    not update even if you rebuild and the new table field will not be included)

7. Clean and Rebuild the solution (this will rebuild the .designer.vb file to include all the new changes!).
Jeff
la source