Я использую Entity Framework 5 с Visual Studio с инструментами Powerity Entity Framework Beta 2 для обратной инженерии баз данных умеренного размера (~ 100 таблиц).
К сожалению, свойства навигации не имеют значимых имен. Например, если есть две таблицы:
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),
...
}
Это приведет к созданию таких классов:
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; }
}
Я вижу несколько вариантов, которые были бы лучше, чем это:
- Используйте имя внешнего ключа: например, все после последнего подчеркивания (
FK_Projects_TechnicalContact
→TechnicalContact
). Хотя это, вероятно, было бы решением с наибольшим контролем, это может быть сложнее интегрировать с существующими шаблонами. - Используйте имя свойства , соответствующее столбцу внешнего ключа: Сбросьте суффикс
ID
(TechnicalContactID
→TechnicalContact
) - Используйте конкатенацию имени свойства и существующего решения: Пример
TechnicalContactIDProjects
(коллекция) иTechnicalContactIDContact
К счастью, можно изменить шаблоны, включив их в проект.
Модификации должны быть сделаны для Entity.tt
и Mapping.tt
. Мне становится трудно из-за отсутствия возможностей intellisense и debug для внесения этих изменений.
Совпадение имен свойств (третий в приведенном выше списке), вероятно, является самым простым решением для реализации.
Как изменить создание навигационных свойств в Entity.tt
и Mapping.tt
для достижения следующего результата:
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; }
}