实体框架代码优先CTP5发布

[原文发表地址] Announcing Entity Framework Code-First (CTP5 release)
[原文发表时间] December 08, 2010 1:39 AM

本周数据组发布了新实体框架代码优先(EF Code-First)库的CTP5版本。 EF Code-First提供了一个很好的以代码为中心的开发工作流程来处理数据。它使你能:

·        开发不需要打开设计器或定义XML映射文件;

·        只需编写 “普通传统类”来定义模型对象而无需定义基类;

·        使用“配置约定”方式保持与数据库的持久化映射,无需任何显式配置;

·        选择性地覆盖常规映射,用流畅(Fluent)代码API完全定制持久化映射。

我是实体框架代码优先的超级粉丝,还在今年夏天写了几个相关的帖子:

·        用实体框架4实现代码优先的开发(7月16日)

·        实体框架代码优先: 自定义数据库模式映射(7月23日)

·        在现有数据库上运用实体框架代码优先(8月3日)

相对CTP4,今天的新CTP5发布版提供了几个重要改进, 并且它将是最终版本前的最后一个预览版。我们将会在明年(2011)第一季度发布实体框架代码优先的最终版。它能与所有的.NET 应用类型兼容(包括ASP.NET网页和ASP.NET MVC项目)。

安装EF Code First:

你可以选择以下两种方法中的任一种来安装并使用实体框架代码优先:

方法1:下载和运行一个安装程序。装好后就可以在你的项目中引用其中的EntityFramework.dll程序集。

或:

方法2:使用Visual Studio内的NuGet PackageManager在项目中下载和安装EF code First。这只需要很简单地打开Visual Studio中的NuGet Package Manager Console(视图-> 其他窗口-> Package Manager Console),然后输入 “Install-Package EFCodeFirst”:

在Package Manager Console中输入“Install-Package EFCodeFirst”会使NuGet去下载EF Code First包,并将其加到当前项目:

这会自动加一个EntityFramwork.dll的引用到项目中:

NuGet帮你安装EF Code First,让你几分钟内就可以使用它了。EF Code First最终版发布后,你将只需输入“Update-Package EFCodeFirst”就可以将现有的项目升级成最终版。

EF Code First程序集和命名空间

EF Code First CTP5更新了程序集名,引入了新的命名空间:

·        程序集名:EntityFramework.dll

·        命名空间:System.Data.Entity

这些命名将与我们最终发行版的库中所用的保持一致。

CTP5中好的新改进

新CTP5发布版的EF code First包括一些不错的改进。突出的有:

·        对现有数据库更好的支持

·        内置模型层验证和Data Annotation支持

·        流畅API 改进

·        可插入的约定支持

·        用于最总新改动的API

·        改进的并行冲突处理

·        对原始的SQL Query/Command的支持

本帖剩下的部分将详细讲述一部分上面所说改动。

对现有数据库更好的支持

EF Code First能很方便的创建作用在现有数据库的模型层。CTP5包括一些细微的改良,能提高这种开发工作流程的效率。

下面是EF Code First为NorthWind示例数据库创建模型层的步骤:

步骤一:创建模型类和DbContext类

要使用EF Code First创建适用于Northwind数据库的简单模型层,下面是所有必需代码:

EF Code First使你能够使用” POCO”——普通传统CLR对象(Plain Old CLR Objects)——来表示数据库中的实体。这意味着你不需要从基类继承模型类,也不需要实现任何接口或数据持久化的属性。这使得模型类干净,易测,而且“透明持久化”。上面的Product和Category类是POCO模型类的示例。

通过生成一个公共属性与数据库中的表相匹配的DbContext类, EF Code First使你能容易地连接POCO模型类和数据库。上面的Northwind类展示了如何实现。它将我们的Product和Category类映射到数据库中的“product”和“Categories”表。Product和Category类中的属性反过来映射到Products和Categories表中的列——每一个Product/Category对象实例对象表中相应的一行。

上面就是创建我们的模型和数据访问层所需的所有代码!对现有的数据库,前面几个版本的EF Code First需要一个别的步骤(调用Database.Initializer<northwind>(null)来防止EF Code First创建新的数据库)——这个步骤在CTP5中已经不需要了。

步骤二:配置数据库连接字符串

我们已经写完所有定义模型层所需的代码。使用前的最后一步是准备一个连接数据库的连接字符串。为了实现这个,我们需要在Web.config文件(或客户端的App.Config文件)中加一个”Northwind”连接字符串,像这样:

<connectionStrings>

<add
connectionString=”data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\northwind.mdf;User Instance=true”
providerName=”System.Data.SqlClient” />

</connectionStrings>

依照EF Code First中使用的约定, DbContext类默认会去寻找与上下文类同名的连接字符串。因为我们的DbContext类名是“Northwind”,所以它默认会去寻找并使用“Northwind”连接字符串。我们上面的Northwind连接字符串设定使用一个本地SQL Express数据库(存储在我们的项目所在目录的\App_Data下)你也能选择指向一个远程SQL 服务器。

步骤三:使用我们的Northwind模型层

通过EF Code First创建的强类型模型层,我们现在能很容易地查询和更改我们的数据库。

下面的代码演示如何将LINQ to Query应用到特定产品类别的产品上。这个查询返回一列与查询条件相符合的强类型对象:

下面的示例代码演示如何检索出一个product对象,修改它的2个属性,然后将改动保存并返回至数据库。

EF Code First帮我们追踪所有这些更改,处理所有数据持久化工作, 让我们能专注于我们的应用与商业逻辑,无需担心数据存取细节。

内置模型验证

EF Code First允许你使用任何想要的验证方法来实现模型层中的业务规则,非常灵活而且强大。

自本周的CTP5开始,EF Code First会包含一个对DataAnnotation和IValidatorObject验证的内置支持, 和.Net4一样。 这让你能很容易地在你的模型上实现一些验证规则,一旦模型层被保存,EF Code First将自动验证它们。它提供一个在你的应用中实现验证的便捷方法。

对Northwind模型应用DataAnnotations

下面的代码演示如何向我们的Product模型的两个属性上添加一些声明性验证规则:

我们使用上面的[Required]和[Range]特性(attribute)。 这些验证特性包含于.Net4的System.ComponentModel.DataAnnotations命名空间中,能独立于EF使用。它们所规定的一些错误信息要不就是被显式地定义(如上),要不就是来自资源文件(它使实现应用程序本地化变得容易)。

SaveChanges()上的强制验证

EF Code First(从CTP5开始)现在将在模型对象被修改或者保存的时候自动运用和强制数据注释规范。你无需写任何代码来实现它,这是默认实现的。

这个新支持意味着如下违反我们上述规范的代码将在我们调用NorthwindDbContext的“SaveChanges()“的时候自动抛出一个异常:

调用SaveChanges() 方法的时候抛出的DbEntityValidationException异常包含一个EntityValidataionErrors属性,你能用它得到模型保存时发生的所有验证错误。这使你能很容易地指导用户如何去修正它们。注意如果一个验证规则被违反,EF Code-First将终止整个修改事务以保证我们的数据库的持续性和有效。

EF Code First的验证强制工作对内置.NET DataAnnotation特性和任何你通过定义继承自基类(System.ComponentModel.DataAnnotations.ValidationAttribute)的子类生成的自定义验证规则都有效。

UI 验证支持

我们很多.NET中的UI框架也支持基于DataAnnotation的验证规则。 比如说, ASP.NET MVC,ASP.NET动态数据和Silverlight(通过WCF Ria Service),所有这些都通过对模型对象的数据使用DataAnnotation,提供客户端UI的验证支持,。

下面这个截图演示在没有提供合适的的值的时候,如何利用ASP.NET MVC3中默认的”Add-View”模板显示一个合适的验证错误信息。

ASP.NET MVC3对客户端和服务端都支持强制执行这些验证规范。显示的错误信息是自动从声明的验证属性中提取出来的——你无需写自定义代码去显示它们。

“保持事物DRY”

DRY原则表示“不要重复你自己(Do not Repeat Yourself)“,是”一次定义,处处适用”的最佳实践方法,防止在你的应用程序中几个不同的地方都重复同样的逻辑/配置/代码。

EF Code First CTP5现在能使你在你的模型类中应用声明性的DataAnnotation验证,然后在所有的应用程序场景中都实施——包括控制器,视图,客户端脚本和任何改动和控制模型类的自定义代码。

有了这些,构建良好的能快速重用与演化的、拥有简洁代码的应用程序将变得更简单。

CTP5中新增的其他EF Code First改进

EF Code First CTP5中还包含一些其他的改进。下面是其中一部分的简单描述。

·        流畅(Fluent)API改进

EF Code First允许覆盖DbContext 类中的”OnModelCreating()” 方法进一步精化/覆盖模型类与相关的数据库结构的映射规则。

CTP5还包括一些针对传入该方法的ModelBuilder类的改良,它能使映射规则的定义更简洁明了。ADO.NET组发表了一些示例和展示如何实现的帖子(这里)

·        可插入约定支持

EF Code First CTP5 提供覆盖EF Code First遵从的“默认约定“的支持,你可以有选择性地用自己的约定集来代替他们:

·        追踪改动的新API

EF Code First CTP5公开了一组新的改动追踪信息,它能让你存取原始的,当前的,已存的值和状态(比如 添加,取消改动,更改,删除)。这个支持在很多场景中都很有用。

·        改进的并发性冲突解决方法

EF Code First CTP5提供了一个更好的,允许访问相关对象实例的异常消息,以及利用当前的,原始的与数据库值解决冲突的能力。

·        原始SQL 查询/命令支持

EF Code First CTP5现在允许通过DbContext.Databaset属性公开的SqlQuery和SqlCommand方法执行原始的SQL查询和命令(包括存储过程SPROCs)。调用这些方法得到的结果能实例化成对象实例,这些实例的改动能被DbContext追踪。这对各种各样的高级场景很有用。

·        完整数据注释支持

EF Code First CTP5现在支持.NET中所有的DataAnnotation,并能使用它们进行验证以及在数据库生成场景中用到EF Code First的时候自动生成合适的数据库模式。

总结

EF Code First提供了优雅又强大的方法来处理数据。它不但非常干净,支持最佳实践方法,而且能非常非常快地实现解决方法,所以我真的很喜欢它。代码唯一的方法则意味着整个模型层都很灵活,容易定制。

本周发布的CTP5进一步改进了EF Code First,并有利于确保明年早期发布时的满意度。我推荐现在就用NuGet安装并试用一下它。我想你会感到惊喜的。

希望对您有所帮助。


上一篇博客:关于ASP.NET MVC 3 RC2的更新(和其中一个缺陷的替代解决方案)