我正在将带有Visual Studio的Entity Framework 5与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; }
// ...
}