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) et TechnicalContactIDContact

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 🙂
InformationsquelleAutor marapet | 2012-10-17