第八章:Code First将走向哪里?

到目前为止,本书已经覆盖了Code First组件的所有功能(包含截止本书写作时的最后一个正式发布版本)。但是还有很多你应该知道的显著功能已经纳入了预览版本。这些功能包括通过迁移数据库构架作为Code First的模型,从现在数据库中逆生成Code First模型和许多其他的有用的功能。

这些特性已经制成Entity Framework NuGget包作为插件进行了发布,可以分别单独下载。目前就有两个可用的插件。第一个,EntityFramework.Migrations NuGet package,为Code First添加了数据库迁移能力。第二个Entity Framework Power Tools,提供了许多Code First的设计时工具,可用于Visural Studio中。

Code First的数据库迁移

本书中我们使用数据库初始化器在每次模型变化时来删除和重建数据库。这不够理想,因为这样做在每次模型变化时都会丢失数据。在本地开发时这也许是可接受的,但是一旦想将变化放在产品中这绝对不是一个可行的解决方案。现在你被强制使用构架比较 工作或手写脚本推动数据库变更到产品数据库。

自从@CF发布后,来自开发者社区的多个呼声指向迁移解决方法。迁移允许的数据库构架随着Code First模型的变化 逐步演变。现在有很多可用的迁移解决方案,但没有一个集成在Code First上。多数解决方案在数据库迁移功能提供了类似的方法。任何一套对数据库变更都会表达代码文件中称之为迁移。迁移是有序的,通常使用一个时间戳和一个数据库中的表保持跟何种踪移已应用到数据库。

@EF团队一直致力于提供一个迁移解决方案,能够紧密集成在Code First。Code First迁移Alpha3已经在2011年9月月初发布。Alpha3发布的详细信息,可以在 http://blogs.msdn.com/b/adonet/archive/2011/09/21/code-first-migrations-alpha-3-released.aspx 找到。这种早期预览版聚焦于在Visual Studio的开发体验,并在Code First模型发生改变时允许迁移到已创建和执行过的数据库上。 Code First目前已经发布了EntityFramework.Migrations NuGet包。一旦安装完毕,它增加了一组命令到包管理器控制台,可用于生成和运行迁移命令。 当Code First模型变化后,你可以要求@CF迁移到创建一个迁移,应用相应的变化到数据库。迁移使用代码表示,一旦迁移已经创建,您可以自由编辑为您生成的代码。例8-1给出了迁移的代码样例。

Example 8-1. Sample migration

namespace BreakAway.Migrations {
    using System.Data.Entity.Migrations;
    public partial class SampleChanges: DbMigration {
        public override void Up() {
            AddColumn("Destinations", "Description", c = >c.String());
            ChangeColumn("Destinations", "Name", c = >c.String(maxLength: 100));
        }
        public override void Down() {
            ChangeColumn("Destinations", "Name", c = >c.String());
            DropColumn("Destinations", "Description");
        }
    }
}

迁移用类似于Fluent API的API来表达。在上述例子中,你可以看到一个描述列被添加到Destinations表中,而Name列的最大长度改为50。provider模型是用来将代码中的具体操作转化成数据库特定的SQL代码。 Code First迁移还支持自动迁移,允许简单的变化,如​​列增加,执行,可以在项目没有迁移存在的情况下执行。您可以同一解决方案中同时使用自动迁移和基于代码的迁移,让你所做的每个更改都处于正确的控制水平。

Entity Framework工具

@EF Power Tools社区预览版(CTP1)于2011年5月发布。这个安装包可以通过VS扩展管理器进行安装,也可 以直接从VS Gallery下载: http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d .

一旦安装,Power Tools会在VS中添加一些设计时工作,可以通过VS解决方案浏览器的上下文菜单来访问。

Code First逆向工程

设计工具的安装后,你会发现在解决方案资源管理器中项目的上下文菜单中出现了一个新的菜单选项—“Enity Framework”(图8-1)。新项下,有一个”Reverse Engineer Code First“子菜单项。选择此选项,会提示你指向一个现有的数据库,这个数据库就是您想使用Code First类来映射的数据库。该工具将会使用数据库的架构产生一个Code First的context,一系列POCO类,以及POCO类映射到数据库的配置设置。在博客文章“Quick Look at Reverse Engineer DB into Code First Classes”,你可以看到这些类看起来像什么。 逆向工程过程的设计为对现有数据库一次性实施代码生成。一旦生成代码,您可能需要调整,以满足您的的数据库架构。例如,CTP1不会对dbo架构生成正确的代码。如果你有另一个构架中的表,您将需要编辑ToTable调用相关的配置对象来指定正确的构架。 Power Tools CTP1只支持逆向工程到C#。Entity Framework团队将在未来版本中引入生成VB.NET的能力。

Figure 8-1. Project context menu

image

查看Code First模型

@EF Power Tools还在“Entity Framework”项中添加了针对继承自DbContext的类的上下文菜单项(图8-2)。当在解决方案资源管理器左键单击代码文件时,Entity Framework 就有了四个选项,前三个提供了模型的不同查看方式: Figure 8-2. Code First context menu image

查看实体数据模型(只读)

“View Entity Data Model(Read Only)”选项将启动Entity Data Model设计器显示定义在context中的模型。Power Tools通过创建了一个临时的代表模型的EDMX文件实现此功能并将其在设计器中打开。

这是对模型的只读查看,任何在设计器的更改不会对代码有任何改变。你能做修改是由于设计品是VS的一部分,没有只读模式。查看模型能力在你试图解析Code First如何表达类与配置时是有用的。设计器也显示映射,因此你可以看到Code First如何映射你的类和属性到数据库的表和列中。

查看实体数据模型XML

 “View Entity Data Model XML”选项在XML编辑器中载入等价于@CF模型的EDMX文件。

这个选项主要用来给Entity Framework团队识别Code First生成模型存在的问题。

查看实体数据模型DDL SQL

“View Entity Data Model DDL SQL ”选项用于生成与Code First用来从模型生成数据库所用的SQL脚本相同的脚本。在使用Code First开发中可能会用到,因为目前需要手写SQL脚本来创建最终产品数据库。

优化实体数据模型

在@EF中的上下文菜单项目的第四个选项是“优化实体数据模型。” 从而允许您使用Code First 模型执行视图生成。

视图生成是一个过程,这个过程中Entity Framework执行一些SQL语句计算,这些语句可用于在模型中对每个类型进行选择,插入,更新,删除。这个过程通常发生在您第一次在应用程序进程中使用上下文时。如果你有一个大的和/或复杂的模型,视图生成是一项耗费资源的操作,非常大的模型在需要几分钟甚至几小时。

为了避免产生这种每次应用程序运行发生的问题,你可以使用预编译的视图。这正是此选项要做的工作:它预先计算 SQL并存储在一个项目中的代码文件中。@EF将在运行时执行这些代码,使用预计算的视图,而不是执行视图生成。执行视图生成后如果模型发生改变,需要重新运行此选项再次计算视图。 预编译视图是相当先进的功能,这里不建议您使用它们,除非你遇到了有关于视图生成相关的性能问题。 预编译和视图生成不只存在于Code First中。这些功能已在EDMX文件中实现,并在Entity Framework第一个版本就有了。Power Tools简单地让你能够在Code First中使用这些功能。你可以阅读更多有关预编译视图和视图生成的内容,见Programing Entity Framework,第二版的第20章。

追随@EF团队 有一些方法可以使你保持获取Entity Framework团队开发的的新功能---甚至影响他们的工作的方向。The ADO.NET团队博客与EF团队共同分享最新发布的公告信息。@EF团队也有专用的设计博客,在那里可以早期获取新功能 的想法以及将要开始开发的功能。这允许您在开发团阶段实施和发布预览版本之前将您的设计需求输入到Entity Framework的设计特征中去。最后,EF的团队有一个用户之声网站,您可以添加和为新功能要求投票。