不幸的是,导航属性没有有意义的名称。例如,如果有两个表:
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; }
}