我正在使用 Entity Framework 5 和 Visual Studio 以及 Entity Framework Power Tools 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
。由于缺乏智能感知和调试的可能性来进行这些更改,我发现这很困难。
连接属性名称(上面列表中的第三个)可能是最容易实现的解决方案。
如何更改导航属性的创建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; }
}