Améliorer la navigation des noms de propriété lorsque le reverse engineering d'une base de données
Je suis en utilisant Entity Framework 5 avec Visual Studio avec Entity Framework, Outils électriques Bêta 2 à désosser taille moyenne des bases de données (~100 tables).
Malheureusement, la les propriétés de navigation n'ont pas des noms significatifs. Par exemple, si il y a deux tables:
CREATE TABLE Contacts (
ContactID INT IDENTITY (1, 1) NOT NULL,
...
CONSTRAINT PK_Contacts PRIMARY KEY CLUSTERED (ContactID ASC)
}
CREATE TABLE Projects (
ProjectID INT IDENTITY (1, 1) NOT NULL,
TechnicalContactID INT NOT NULL,
SalesContactID INT NOT NULL,
...
CONSTRAINT PK_Projects PRIMARY KEY CLUSTERED (ProjectID ASC),
CONSTRAINT FK_Projects_TechnicalContact FOREIGN KEY (TechnicalContactID)
REFERENCES Contacts (ContactID),
CONSTRAINT FK_Projects_SalesContact FOREIGN KEY (SalesContactID)
REFERENCES Contacts (ContactID),
...
}
Cela va générer des classes comme ceci:
public class Contact
{
public Contact()
{
this.Projects = new List<Project>();
this.Projects1 = new List<Project>();
}
public int ContactID { get; set; }
//...
public virtual ICollection<Project> Projects { get; set; }
public virtual ICollection<Project> Projects1 { get; set; }
}
public class Project
{
public Project()
{
}
public int ProjectID { get; set; }
public int TechnicalContactID { get; set; }
public int SalesContactID { get; set; }
//...
public virtual Contact Contact { get; set; }
public virtual Contact Contact1 { get; set; }
}
Je vois plusieurs variantes qui doivent toutes être mieux que cela:
- Utiliser le nom de la clé étrangère: Par exemple, tout ce qui est après le dernier caractère de soulignement (
FK_Projects_TechnicalContact
-->TechnicalContact
). Mais ce serait sans doute la solution avec le plus de contrôle, cela peut être plus difficile à intégrer avec les modèles existants. - Utiliser le nom de la propriété correspondant à la colonne de la clé étrangère: enlever le suffixe
ID
(TechnicalContactID
-->TechnicalContact
) - Utiliser le concaténation du nom de la propriété et de la solution existante: Exemple
TechnicalContactIDProjects
(collection) etTechnicalContactIDContact
Heureusement, il est possible de modifier les modèles en les incluant dans le projet.
Les modifications pourraient être apportées à Entity.tt
et Mapping.tt
. Je trouve cela difficile à cause du manque d'intellisense et de déboguer des possibilités pour faire ces changements.
La concaténation des noms de propriété (la troisième dans la liste ci-dessus) est probablement la solution la plus simple à mettre en œuvre.
Comment changer la création de navigation propriétés dans Entity.tt
et Mapping.tt
pour obtenir le résultat suivant:
public class Contact
{
public Contact()
{
this.TechnicalContactIDProjects = new List<Project>();
this.SalesContactIDProjects = new List<Project>();
}
public int ContactID { get; set; }
//...
public virtual ICollection<Project> TechnicalContactIDProjects { get; set; }
public virtual ICollection<Project> SalesContactIDProjects { get; set; }
}
public class Project
{
public Project()
{
}
public int ProjectID { get; set; }
public int TechnicalContactID { get; set; }
public int SalesContactID { get; set; }
//...
public virtual Contact TechnicalContactIDContact { get; set; }
public virtual Contact SalesContactIDContact { get; set; }
}
- Pour info, vous pouvez télécharger et utiliser Tangible T4 éditeur de T4 de l'édition d'un peu plus facile: t4-editor.tangible-engineering.com/.... La version gratuite est limitée, mais c'est mieux que rien du tout 🙂
Vous devez vous connecter pour publier un commentaire.
Il y a quelques choses que vous devez changer à l'intérieur de l' .tt fichier. Je choisis d'utiliser la troisième solution vous l'avez suggéré, mais cela nécessite d'être formatés comme FK_CollectionName_RelationName. J'ai divisé avec le '_' et l'utilisation de la dernière chaîne dans le tableau.
J'utilise le RelationName avec le ToEndMember propriété pour créer un nom de propriété. FK_Projects_TechnicalContact entraînera
et de vos projets sera comme ceci.
Maintenant le code, vous pouvez le demander. Ive a ajouté 2 fonctions à la
CodeStringGenerator
classe dans le fichier T4. Celui qui construit le propertyName recevoir un NavigationProperty. et l'autre, de générer le code pour le bien recevoir un NavigationProperty et le nom de la propriété.Si vous placez le code ci-dessus dans la classe que vous avez encore besoin de changer les 2 parties. Vous devez trouver l'endroit où le constructeur de la partie et la navigation de la partie de la propriété sont en train de construire de l'entité. Dans le constructeur de la partie (autour de la ligne 60), vous devez remplacer le code existant par l'appel de la méthode
GetPropertyNameForNavigationProperty
et en la passant à la méthode d'échappement.Et dans le NavigationProperties partie (autour de la ligne 100), vous aurez également besoin de remplacer le code par le suivant.
J'espère que cette aide, et vous pouvez toujours déboguer le
GetPropertyNameForNavigationProperty
de fonction et de jouer un peu avec la désignation de la propriété.CodeStringGenerator
classe?Bâtiment sur BikeMrown réponse, nous pouvons ajouter Intellisense pour les propriétés à l'aide de la
RelationshipName
qui est défini dans MSSQL:Modifier le modèle.tt dans votre VS Projet, et le modifier:
à ceci:
Maintenant où vous commencez à taper un nom de propriété, vous obtenez une info-bulle comme ceci:
Il est sans doute intéressant de noter que si vous changer votre DB modèle, les propriétés peuvent trouver eux-mêmes de pointer les différentes DB champs parce que l'EF génère de navigation noms de propriété en fonction de leurs propres DB champ nom du alphabétique priorité!
Trouve cette question/réponse très utile. Cependant, je ne voulais pas en faire autant que Rikko de réponse. J'ai juste besoin de trouver le nom de la colonne impliqués dans la NavigationProperty et ne voyais pas comment obtenir que, dans l'un des échantillons (au moins pas sans un edmx pour tirer à partir d').
La réponse sélectionnée est génial et m'a fait aller dans la bonne direction pour vous. Mais mon gros problème c'est qu'il a pris tous mes travaillent déjà les propriétés de navigation et ajoutés à la base de nom de type à eux, de sorte que vous ne finissent avec des choses comme la suivante.
Alors j'ai creusé dans les ajouts proposés à la .tt fichier et modifié un peu pour supprimer les doublons de type de nommage et de nettoyer un peu les choses. Je figure il doit bien y avoir quelqu'un d'autre qui voudrait la même chose alors j'ai pensé poster ma résolution ici.
Voici le code de mise à jour dans la
public class CodeStringGenerator
et voici le code de mise à jour dans la génération d'un modèle de
mettre à jour les deux occurrences de ce:
à ce