ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,现已经包含在 Visual Studio 2008 Service Pack 1 以及 .NET Framework 3.5 Service Pack 1 中发布。目前最新版本为4.1,可以点此下载。
为方便描述,以下简称EF, EF的出现彻底改变了.NET领域没有公认权威的ORM框架的局面,在此之前,当然在这个领域以前也有很多ORM框架【NHibernate、Castle..】,运用他们已经开发出了很多成功的项目,但是它们也有一些不仅人意的地方【工具支持不好、缺乏文档、异常不明确...】,这些原因我想归结于它们是开源作品的缘故,可以理解,开源意味这资金问题、维护问题...
EF出自微软官方,身出名门哈,就它的权威性已经使大批微软的忠实开发者趋之若弩。个人感觉,微软从来不出手则罢,出手则大手笔,EF就是微软在ORM领域的大手笔。
Entity Framework 依赖于业务实体对象的概念模型,称为Entity Data Model(EDM),如何选择创建Model是第一个需要考虑的问题。有3中可选的方法:
- Database First – 首先创建传统的数据库,然后利用数据库的返向工程向导,创建概念模型。
- Model First – 使用可视化的EDM设计器设计EDM,接着根据Model 生成数据库。
- Code First – 编写代表概念模型的类,使用Code First技术过程中,没有可视化的Model类。
这一点上和NHibernate基本一致,在NHibernate里面你可以选择从数据反向生成模型[Database First],也可以先编写你的模型代码,然后通过.hbm.xml对象关系映射文件完成模型到关系数据库的映射[Code First],至于EF的Model First我只能说等待开发社区未来支持吧
概览:
ADO.NET Entity Framework 以 Entity Data Model (EDM) 为主,将数据逻辑层切分为三块,分别为 Conceptual Schema, Mapping Schema 与 Storage Schema 三层,其上还有 Entity Client,Object Context 以及 LINQ 可以使用。在最新4.1版本中,增加了 DbContext API及Codefirst,DbContext API是基于ObjectContext和其他一些类型抽象出的一个简单的API,并进行了优化。 Code First是基于Entity Framework的新的开发模式,原先只有Database First和Model First两种。Code First先用C#/VB.NET的类定义模型,然后映射到现有的数据库或者产生新的数据库结构。Code First同样支持通过Data Annotations或fluent API进行定制化配置。
实体框架不仅仅是另一种对象关系映射解决方案,从本质上讲,它的作用是使应用程序能够访问和更改概念模型中以实体和关系形式表示的数据。实体框架使用模型和映射文件中的信息将对概念模型中表示的实体类型的对象查询转换为特定于数据源的查询。查询结果具体化为实体框架管理的对象。实体框架为查询概念模型并返回对象提供了以下几种方式:
-
LINQ to Entities.提供语言集成查询 (LINQ) 支持,用于查询在概念模型中定义的实体类型。有关更多信息,请参见 LINQ to Entities。
-
Entity SQL.与存储无关的 SQL 方言,直接使用概念模型中的实体并支持实体数据模型概念。Entity SQL 可用于对象查询和通过使用 EntityClient 提供程序执行的查询。有关更多信息,请参见Entity SQL 概述。
-
查询生成器方法。这些方法让您可以使用 LINQ 风格的查询方法构造 Entity SQL 查询。有关更多信息,请参见 查询生成器方法(实体框架)。
实体框架 中包含 EntityClient 数据提供程序。此提供程序管理连接,将实体查询转换为特定于数据源的查询,并返回实体框架用于将实体数据具体化为对象的数据读取器。当不需要对象具体化时,通过使应用程序执行 Entity SQL 查询并使用返回的只读数据读取器,还可以像使用标准 ADO.NET 数据提供程序一样使用 EntityClient 提供程序。有关更多信息,请参见用于实体框架的 EntityClient 提供程序。
下图阐释了用于访问数据的实体框架体系结构:
实体数据模型工具可生成一个从 ObjectContext 派生的类,该类表示概念模型中的实体容器。 此对象上下文提供跟踪更改以及管理标识、并发和关系的功能。此类还公开将插入、更新和删除操作写入数据源的SaveChanges 方法。 与查询类似,这些更改是由系统自动生成的命令或由开发人员指定的存储过程执行的。