適度なサイズのデータベース (~100 テーブル) をリバース エンジニアリングするために、Entity Framework Power Tools Beta 2 を備えた Visual Studio で Entity Framework 5 を使用しています。
残念ながら、ナビゲーション プロパティには意味のある名前がありません。たとえば、2 つのテーブルがある場合:
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
ます。これらの変更を行うためのインテリセンスとデバッグの可能性がないため、難しいと思います。
プロパティ名の連結(上記のリストの 3 番目) は、実装するのがおそらく最も簡単なソリューションです。
でナビゲーション プロパティの作成を変更し、次の結果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; }
}