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, 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 la 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 devront être apportées à l' 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 faire pour modifier la création de navigation propriétés en Entity.tt
et Mapping.tt
pour atteindre 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; }
}