本视频和分步演练演示可使用 EF Power Tools 完成的任务。EF Power Tools 为我们考虑在未来版本中向实体框架主工具新增的功能提供了预览。
命令摘要
安装 EF Power Tools 后,将提供以下上下文菜单项。本演练将详细讨论这些选项:
右键单击 C# 项目时,您将会看到:
- 对 Code First 进行反向工程 - 为现有数据库生成 DbContext 派生类、POCO 类和 Code First 映射类。
- 自定义反向工程模板 - 将默认反向工程 T4 模板添加到项目中,以便可以自定义代码生成。
右键单击包含 DbContext 派生类的文件时,您将会看到:
- 查看实体数据模型(只读) - 在 EF 设计器中显示 Code First 模型的只读视图。
- 查看实体数据模型 XML - 显示表示基础 Code First 模型的 EDMX XML。
- 查看实体数据模型 DDL SQL- 显示与基础 EDM 模型中的 SSDL 相对应的 DDL SQL。
- 生成视图 - 生成预编译视图,EF 运行时可使用这些视图提高启动性能。
右键单击 EDMX 文件(使用 EF 设计器时生成)时,您将会看到:
必备条件
要完成本演练,您需要安装以下软件:
- Visual Studio 2012 或 Visual Studio 2010
- Visual Studio 库中 EF Power Tools 的最新版本
- School Database
创建应用程序
本演练使用 Visual Studio 2012。
- 打开 Visual Studio
- “文件”->“新建”->“项目”…。
- 在左窗格中选择“Windows”,然后在右窗格中选择“控制台”
- 输入 EFPowerToolsSample 作为名称
- 选择“确定”
对 Code First 进行反向工程
“对 Code First 进行反向工程”命令用于根据现有数据库,生成 POCO 类、映射(配置)类和 DbContext 派生类。
- 右键单击项目,然后选择“实体框架”–>“对 Code First 进行反向工程”。
- 输入要根据其对 Code First 进行反向工程的现有数据库的相关信息。
注意:这将对数据库中的所有表进行反向工程,因此如果不希望操作所有表,需要从模型中手动删除不需要的表。
可以在 Visual Studio 的状态栏中看到反向工程过程的进度。过程完成后,会对项目进行以下更新。
- 使用连接字符串更新配置文件 (.config)
- 在项目中添加对 EntityFramework NuGet 包的引用
- 在“模型”文件夹下生成 DbContext 派生类和一组 POCO 类。此外,还会在嵌套在“模型”文件夹下的“映射”文件夹下生成映射类。
在初始代码生成覆盖以前生成的文件后,重新运行此命令。
如果您对生成这些类的方式不完全满意,可以在生成这些类后对其进行编辑,或者使用下一节介绍的“自定义反向工程模板”命令。
自定义反向工程模板
某些情况下,您可能希望更改生成代码的方式。例如,生成的代码使用 Fluent API 配置模型(如下所示),但您可能希望改用数据注释。
本节的其余部分演示如何修改代码生成,使表\列映射配置为使用数据注释而不是 Fluent API(如下所示)。
- 右键单击项目,然后选择“实体框架”–>“自定义反向工程模板”
选择“自定义反向工程模板”,然后将 T4 模板添加到项目中。随后 EF Power Tools 使用这些模板为上下文、实体和映射类生成代码。
注意:您可能会看到因 Visual Studio 尝试验证该模板所导致的以下错误。由于我们不会在项目中运行这些模板,可以忽略该错误。
正在编译转换: 找不到类型或命名空间名称“EfTextTemplateHost”(是否缺少 using 指令或程序集引用?)
现在需要编辑这些模板。
- 打开 Mapping.tt 文件。
首先,我们将删除生成 Fluent API 表\列映射的代码
- 在文件中搜索 var tableSet = efHost.TableSetstring(确保不要粘贴空格字符)。
- 删除从此行开始到 // Find m:m relationships to configure 上方的行结束的代码。
下面是要删除的代码:
var tableSet = efHost.TableSet;
var tableName = (string)tableSet.MetadataProperties["Table"].Value
?? tableSet.Name;
var schemaName = (string)tableSet.MetadataProperties["Schema"].Value;
#>
// Table & Column Mappings
<#
if (schemaName == "dbo" || string.IsNullOrWhiteSpace(schemaName))
{
#>
this.ToTable("<#= tableName #>");
<#
}
else
{
#>
this.ToTable("<#= tableName #>", "<#= schemaName #>");
<#
}
foreach (var property in efHost.EntityType.Properties)
{
#>
this.Property(t => t.<#= property.Name #>).HasColumnName("<#= efHost.PropertyToColumnMappings[property].Name #>");
<#
}
- 保存 Mapping.tt 文件
- 打开 Entity.tt 文件
现在,我们将添加数据注释映射以包含 [Table] 和 [Column] 属性。 我们根据刚删除的 Fluent API 代码添加数据注释代码。当然,您可以进一步进行修改。
- 将添加 [Table] 属性的代码(显示为黑色)粘贴到显示为浅灰色的行的后面。
namespace <#= code.EscapeNamespace(efHost.Namespace) #>
{
<#
var tableSet = efHost.TableSet;
var tableName = (string)tableSet.MetadataProperties["Table"].Value
?? tableSet.Name;
var schemaName = (string)tableSet.MetadataProperties["Schema"].Value;
#>
<#
if (schemaName == "dbo" || string.IsNullOrWhiteSpace(schemaName))
{
#>
[Table("<#= tableName #>")]
<#
}
else
{
#>
[Table("<#= tableName #>", Schema="<#= schemaName #>")]
<#
}
#>
- 将添加 [Column] 属性的代码(显示为黑色)粘贴到显示为浅灰色的行的后面。
foreach (var property in efHost.EntityType.Properties)
{
#>
[Column("<#= efHost.PropertyToColumnMappings[property].Name #>")]
<#
- 我们还需要添加一个 using 语句来指定定义数据注释的位置。在最新版实体框架中,数据注释在 System.ComponentModel.DataAnnotations.Schema 中定义。在以前的版本中,它们在 System.ComponentModel.DataAnnotations 中定义。我们将添加以下逻辑,以便根据 EF 版本添加正确的 using 语句。
using System;
using System.Collections.Generic;
<#
if (efHost.EntityFrameworkVersion >= new Version(4, 4))
{
#>
using System.ComponentModel.DataAnnotations.Schema;
<#
}
else
{
#>
using System.ComponentModel.DataAnnotations;
<#
}
#>
- 保存 Entity.tt 文件
- 重复反向工程过程,这一次将使用自定义模板生成代码
注意:对 T4 模板进行更改后,必须执行以下操作才能使这些更改反映在代码生成中:
- 更新 .tt 文件后将其保存
- 执行“对 Code First 进行反向工程”
查看实体数据模型
右键单击包含 DbContext 派生类定义的文件时,您会看到本节介绍的三个 EDM 查看选项。
查看实体数据模型(只读)
即使使用 Code First 开发时,您也可能希望以图形方式查看模型。此“查看实体数据模型”选项在 EF 设计器中显示 Code First 模型的只读视图。虽然使用 Designer 可以修改该模型,但您将无法保存所做的更改。
查看实体数据模型 XML
使用此选项可以查看表示基础 Code First 模型的 EDMX XML。使用此选项的机会不会很多。偶尔在调试某些 Code First 问题时可能需要使用它。
查看实体数据模型 DDL SQL
使用此选项可以查看与基础 EDM 模型中的 SSDL 相对应的 DDL SQL 脚本。当您要查看将由模型生成的表和列时,可能需要使用此选项。
生成预编译视图
可以使用“生成视图”选项生成预编译的视图,实体框架运行时可使用这些视图提高启动性能。所生成的视图文件将添加到项目中。您可以在以下文章中详细了解视图编译: 性能注意事项。
使用 Code First 以及 EF 设计器时,都将提供“生成视图”选项。
- 如果使用 Code First,右键单击包含 DbContext 派生类的文件时将显示“生成视图”选项。
- 如果使用 EF 设计器,右键单击 EDMX 文件时将显示“生成视图”选项。
请注意,每次更改模型时,都需要通过重新运行“生成视图”命令来重新生成预编译视图。