我们一直在使用 EF 4.0 以及使用 .edmx
模型的数据库优先方法。
我们现在正在升级到 EF 6.1.3,我们正在研究是否使用或不使用 .edmx
模型。我们肯定仍然希望控制我们的数据库模式 - 因此我们将使用 SQL 脚本创建新表等,然后从现有数据库。
在试用 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
并影响生成过程 - 如果您正在执行“生成代码 -首先从现有数据库”的方法?我再也找不到关于该主题的任何博客文章或文章......
或者是否有另一种方法可以影响 EF 生成类的方式 - 最显着的是导航属性?我可以定义某种自定义约定或其他东西来影响它吗?
最佳答案
您可以在 .edmx 文件中更改生成类的设置(通过记事本等)。只需在更改之前备份它。这并不理想,但它可以工作并且来自数据库的更新不会覆盖您的更改。
<EntityType Name="SomeEntityName" a:TypeAccess="Internal" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property Name="Id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
<Property Name="Contact" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="false" />
<Property Name="DesignContact" Type="String" Nullable="false" MaxLength="50" FixedLength="false" Unicode="false" />
</EntityType>
关于c# - 影响如何在 EF 6 代码优先中从数据库创建实体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32522770/