影响如何在 EF 6 代码优先中从数据库创建实体 类
Influencing how entity classes are created in EF 6 code-first from database
我们一直在使用 EF 4.0 以及使用 .edmx
模型的数据库优先方法。
我们现在正在升级到 EF 6.1.3,我们正在研究是否使用或不使用该 .edmx
模型。我们肯定仍然希望控制我们的数据库模式 - 所以我们将使用 SQL 脚本创建新的 tables 等,然后生成 EF 模型(.edmx
或者只是来自现有数据库的代码 classes)。
在试用 Visual Studio 2013 期间,当 EF 6 从现有数据库创建 classes 时,我注意到一个烦人的地方。
我有一个 Customer
class 链接到 Contact
class 三次 - 一次用于 DesignContact
,一次用于 SalesContact
,第三次SupportContact
的时间。这些在 Customer
table.
中存储为 DesignContactId (INT)
等列
您可以使用此 T-SQL:
创建那些 classes
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),
)
从数据库创建 classes 时,我看到了:
Customer
class 将我的三个 xxxContactId
列作为字段 - 符合预期
- EF 还生成三个类型为
Contact
的导航属性 - 但它调用它们 Contact
、Contact1
、Contact2
- uuuuuggghHHHH!
我正试图找到一种方法来绕过那些非常糟糕的命名导航属性.....这些很糟糕,因为:
- 他们不直观 - 现在哪个指向哪个联系人?
- 是 "stable" 吗?如果引入与
Contact
的第四种关系,它们会随着时间而改变吗?不确定......(找不到任何文档)
- 只是他们的名字绝对可怕......为什么他们不叫
DesignContact
(基于DesignContactId
),SalesContact
(基于SalesContactId
) 等等?
在 EF 4.1 及更高版本中,您可以将 T4 模板添加到 .edmx
并影响生成过程 - 如果您正在执行 "Generate code-first from existing database" 方法,EF6 是否仍然可能以某种方式实现?我再也找不到关于该主题的任何博客 post 或文章......
或者是否有另一种方法可以影响 EF 生成 classes 的方式 - 最显着的是导航属性?我可以定义某种自定义约定或影响它的东西吗?
您可以在 .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>
感谢大家的参与 - 我尝试了各种方法:
我尝试了 Codeplex 上的 "EF Reverse Poco" 项目,但对它一点都不满意
我尝试了适用于 EF 6 的 EF Power Tools - 它工作得很好。这让我可以添加 T4 模板来影响代码生成过程。有效 - 但现在的挑战是理解用作代码生成基础的对象模型(这似乎没有记录......)
我尝试了 Entity Framework 6.1.3 Code Templates for C# NuGet 包 - 也可以很好地工作,但与 Power Tools 有相同的问题 - 实际改变任何东西,大量挖掘对象模型将需要
我们一直在使用 EF 4.0 以及使用 .edmx
模型的数据库优先方法。
我们现在正在升级到 EF 6.1.3,我们正在研究是否使用或不使用该 .edmx
模型。我们肯定仍然希望控制我们的数据库模式 - 所以我们将使用 SQL 脚本创建新的 tables 等,然后生成 EF 模型(.edmx
或者只是来自现有数据库的代码 classes)。
在试用 Visual Studio 2013 期间,当 EF 6 从现有数据库创建 classes 时,我注意到一个烦人的地方。
我有一个 Customer
class 链接到 Contact
class 三次 - 一次用于 DesignContact
,一次用于 SalesContact
,第三次SupportContact
的时间。这些在 Customer
table.
DesignContactId (INT)
等列
您可以使用此 T-SQL:
创建那些 classesCREATE 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),
)
从数据库创建 classes 时,我看到了:
Customer
class 将我的三个xxxContactId
列作为字段 - 符合预期- EF 还生成三个类型为
Contact
的导航属性 - 但它调用它们Contact
、Contact1
、Contact2
- uuuuuggghHHHH!
我正试图找到一种方法来绕过那些非常糟糕的命名导航属性.....这些很糟糕,因为:
- 他们不直观 - 现在哪个指向哪个联系人?
- 是 "stable" 吗?如果引入与
Contact
的第四种关系,它们会随着时间而改变吗?不确定......(找不到任何文档) - 只是他们的名字绝对可怕......为什么他们不叫
DesignContact
(基于DesignContactId
),SalesContact
(基于SalesContactId
) 等等?
在 EF 4.1 及更高版本中,您可以将 T4 模板添加到 .edmx
并影响生成过程 - 如果您正在执行 "Generate code-first from existing database" 方法,EF6 是否仍然可能以某种方式实现?我再也找不到关于该主题的任何博客 post 或文章......
或者是否有另一种方法可以影响 EF 生成 classes 的方式 - 最显着的是导航属性?我可以定义某种自定义约定或影响它的东西吗?
您可以在 .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>
感谢大家的参与 - 我尝试了各种方法:
我尝试了 Codeplex 上的 "EF Reverse Poco" 项目,但对它一点都不满意
我尝试了适用于 EF 6 的 EF Power Tools - 它工作得很好。这让我可以添加 T4 模板来影响代码生成过程。有效 - 但现在的挑战是理解用作代码生成基础的对象模型(这似乎没有记录......)
我尝试了 Entity Framework 6.1.3 Code Templates for C# NuGet 包 - 也可以很好地工作,但与 Power Tools 有相同的问题 - 实际改变任何东西,大量挖掘对象模型将需要