原文:http://msdn.microsoft.com/en-us/data/jj593170.aspx
本分步演练演示了你可以使用EF Power Tools完成的任务。EF Power Tools提供了一个,我们考虑将其增加到未来发布的主要实体框架工具集中的功能预览。
命令概述
在你安装EF Power Tools后,下面的上下文菜单项是可用的:
当你在一个C#项目上右点,你会看到:
- Reverse Engineer Code First-生成继承自DbContext的类,POCO类,以及一个现存数据库的代码优先映射类
- Customize Reverse Engineer Templates-增加缺省的反向工程T4模板到你的项目,以便你可以自定义代码生成。
当你在包含一个继承自DbContext的类的文件上右点,你会看到:
- View Entity Data Model(Read-only)-在EF设计器中,显示一个只读的代码优先模型视图。
- View Entity Data Model XML-显示描述相关的代码优先模型的EDMX XML文件。
- View Entity Data Model DDL SQL-显示相应于在相关的EDM模型中的SSDL的DDL(数据定义语言)SQL。
- Generate Views-使用EF运行时生成预编译视图,以改善启动性能。
当在一个EDMX文件上右点时(当你使用EF设计器工作时生成),你会看到:
- Generate Views–同前描述。
先决条件
要完成这个演练,你需要安装:
- Visual Studio 2012 or Visual Studio2010
- 安装最新版的EF Power Tools,来自Visual Studio Gallery。
- School示例数据库
译注:如果你已经安装了以前的EF Power Tools版本,你可能需要首先从Visual Studio中卸载以前的版本,才能安装此最新的EF Power Tools版本。打开Visual Studio,指向菜单项Tools -〉Extention Manager,打开Extention Manager对话框,在Installed Entensions类别中,找到EF Power Tools以前的版本,单击Unistalled,卸载以前的版本。
创建应用程序
本演练使用Visual Studio 2012.
- 打开Visual Studio
- File -> New -> Project…
- 选择Windows模板类别和Console模板项目
- 键入EFPowerToolsSample作为项目名称
- 选择OK
Reverse Engineer Code First - 反向工程代码优先
反向工程代码优先命令用于生成基于现存的数据库的POCO,映射(配置),以及继承自DbContext的类。
- 右点项目,选择Entity Framework–>Reverse Engineer Code First。
- 键入你想要反向工程的现存数据库的信息
注释:这将反向工程在数据库中的所有数据表,因此如果你不希望是全部,你必须从模型中手动删除它们。
你可以在Visual Studio的状态条看到反向工程过程的进度。过程完成时,将对你的项目做出下面的更新。
- 用连接串更新配置文件(.config)
- EntityFramework NuGet包的引用被增加到项目中
- 一个DbContext的继承类和一套POCO类被生成在Models文件夹下面。同样映射类被生成在内嵌在Models文件夹的Mapping文件夹下面。
在出事代码生成后,重新运行该命令将重写已经生成的文件。
如果你对这种方式生成的类不完全满意,你可以在生成后直接编辑类,或者使用在后文描述的Customize Reverse Engineer Templates命令。
Customize Reverse Engineer Templates - 自定义反向工程模板
在某些情况下,你可能想要去改变代码生成的方式。例如,生成的代码使用Fluent API配置模型(如下所示),但你可能想要使用Data Annotations代替。
本节剩下的部分将演示,如何修改代码生成,以便表\列映射使用Data Annotations配置,以代替Fluent API(如下所示)。
- 右点项目,选择Entity Framework–>Customize Reverse Engineer Templates
选择Customize Reverse Engineer Templates,增加T4模板到你的项目。EF Power Tools随后将使用这些模板来生成代码,为你的上下文,实体,和映射类。
注释:你可能会看到下面的,由于Visual Studio试图去验证模板而引起的错误。因为模板从未在你的项目中运行过,你可以忽略它。
Compiling transformation: The type or namespace name ‘EfTextTemplateHost’ could not be found (are you missing a using directive or an assembly reference?)
现在是时候可以编辑模板了。
- 打开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文件
我们现在讲增加Data Annotation映射,包含[Table]和[Column]特性。我们将基于刚刚删除的Fluent API创建ata Annotation代码。当然你可以进一步地修改它。 - 粘贴以亮灰色显示的代码行后面的代码(以黑体显示)去增加[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语句,以指定Data Annotations是在哪里定义的。在目前的Entity Framework版本中,被定义在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文件
- 执行Reverse Engineer Code First命令
译注:另一个开发者最常使用的自定义的,为生成的实体类增加 [Serializable] 特性,以使能POCO类可以直接存储在类似Web应用的应用程序、会话、ViewState或数据缓存中。你只需修改 Entity.tt 文件,在POCO类定义生成代码前增加[Serializable]。
查看实体数据模型
当你在包含DbContext继承类定义的文件上右点时,你可以看到三个描述在下节的EDM查看选项。
View Entity Data Model (Read-only) - 查看实体数据模型(只读)
即使在使用代码优先进行开发工作时,你也可能希望图形化地查看你的模型。View Entity Data Model选项在EF设计器显示一个只读的代码优先模型视图。尽管这设计允许你修改模型,你也不能够保存这些改变。
View Entity Data Model XML - 查看实体数据模型XML
该选项允许你查看描述相关的代码优先模型的EDMX XML数据。你可能不会在大多数场合使用这个选项。一种情况是,当调试某些代码优先问题是,你可能需要使用它。
View Entity Data Model DDL SQL - 查看实体数据模型DDL(数据定义语言)SQL
该选项允许你查看,在相关的EDM模型中的,相应于SSDL的DDL(数据定义语言)SQL脚本。
Generating Pre-compiled Views - 生成预编译视图
你可以使用Generate Views选项生成,由实体框架运行时使用的,用于改善启动性能的预编译视图。生成的视图文件被增加到项目中。你可以在下述文章:Performance Considerations,阅读更多的有关视图编译的内容。
Generate Views选项在使用代码优先和使用EF设计器的时候都是可用的。
- 当使用代码优先时,可以在包含DbContext继承类的文件上右点,使用Generate Views选项。
- 当使用EF设计器时,可以右点EDMX文件,使用Generate Views选项。
注意,每次你改变你的模型,你需要通过再次运行Generate Views命令,重新生成预编译的视图。