【发布时间】:2015-09-11 11:46:27
【问题描述】:
我们一直在使用 EF 4.0 和使用 .edmx 模型的数据库优先方法。
我们现在正在升级到 EF 6.1.3,并且正在调查是否使用 .edmx 模型。我们肯定仍然希望控制我们的数据库架构 - 因此我们将使用 SQL 脚本创建新表等,然后从现有数据库生成 EF 模型(.edmx 或只是代码类)。
在试用 Visual Studio 2013 期间,我注意到 EF 6 从现有数据库创建类时的一个恼人点。
我有一个Customer 类,它三次链接到Contact 类——一次用于DesignContact,一次用于SalesContact,第三次用于SupportContact。这些在Customer 表中存储为DesignContactId (INT) 等列。
您可以使用此 T-SQL 创建这些类:
CREATE TABLE dbo.Contact
(
ContactID INT NOT NULL
CONSTRAINT PK_Contact PRIMARY KEY CLUSTERED,
Name VARCHAR(200),
Address VARCHAR(200),
ZipCode VARCHAR(20),
City VARCHAR(100),
Phone VARCHAR(100)
)
CREATE TABLE dbo.Customer
(
CustomerID INT NOT NULL
CONSTRAINT PK_Customer PRIMARY KEY CLUSTERED,
Name VARCHAR(200),
-- other properties
DesignContactID INT
CONSTRAINT FK_Customer_DesignContact
FOREIGN KEY REFERENCES dbo.Contact(ContactID),
SalesContactID INT
CONSTRAINT FK_Customer_SalesContact
FOREIGN KEY REFERENCES dbo.Contact(ContactID),
SupportContactID INT
CONSTRAINT FK_Customer_SupportContact
FOREIGN KEY REFERENCES dbo.Contact(ContactID),
)
从数据库创建类时,我看到了:
-
Customer类将我的三个xxxContactId列作为字段 - 这是预期的 - EF 还生成
Contact类型的三个导航属性 - 但它称它们为Contact、Contact1、Contact2- uuuuuggghHHHH!
我正试图找到一种方法来绕过那些糟糕的命名导航属性.....这些很糟糕,因为:
- 他们不直观 - 现在哪一个指向哪个联系人?
- 是“稳定的”,或者如果引入与
Contact的第四个关系,它们会随着时间而改变吗?不确定.....(找不到关于此的任何文档) - 只是他们的名字太可怕了……为什么不叫他们
DesignContact(基于DesignContactId)、SalesContact(基于SalesContactId)等等?
在 EF 4.1 及更高版本中,您可以将 T4 模板添加到 .edmx 并影响生成过程 - 如果您正在执行“从现有数据库生成代码优先”方法,那么使用 EF6 是否仍然可以这样做?我再也找不到任何关于该主题的博文或文章.....
或者是否有另一种方式来影响 EF 生成类的方式 - 最显着的是导航属性?我可以定义某种自定义约定或其他东西来影响这一点吗?
【问题讨论】:
-
@JulieLerman:对此有何想法(作为英孚女王?:-))
-
@RowanMiller:你有什么想法或技巧来处理这个问题吗?
-
在 EF6 中没有 PT 吗?! visualstudiogallery.msdn.microsoft.com/…
-
我总是使用 Power Tools 的 beta 版本,它生成正常。然后在 VS 中添加 T4 模板。唯一的问题是您必须生成所有可能需要一段时间的对象。
-
不知道这是否有帮助,但你见过efreversepoco.codeplex.com
标签: c# sql-server visual-studio-2013 entity-framework-6 code-first