反向工程数据库时改进导航属性名称

我正在将带有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; }

     // ...

}

蛊毒传说
浏览 623回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP