随着微软在3月10日发布的VS2010 SP1,Entity Framework 4.0 也正式发布了。
安装完毕VS2010 SP1补丁,帮助文档查看器也有了改善,之前的Help查看器是1.0版本,没有“索引”、“收藏夹”等功能,使用上面非常不方便,现在也加入了进来,方便查找相关资料和收集资料了。
打开“NET Framework 4 ”、“.NET Framework 核心开发”、“数据访问和建模”、“ADO.NET 实体框架”,先从实体框架概述开始学习 AOD.NET Entity Framework。
实体框架是 ADO.NET 中的一套支持开发面向数据的软件应用程序的技术。面向数据的应用程序的架构师和开发人员曾为实现两个迥然不同的目标费尽心机:他们必须为要解决的业务问题的实体、关系和逻辑构建模型,还必须处理用于存储和检索数据的数据引擎。数据可能跨多个各有不同协议的存储系统;甚至使用单个存储系统的应用程序也必须在存储系统的要求与编写高效且容易维护的应用程序代码之间取得平衡。
实体框架使开发人员可以采用特定于域的对象和属性(如客户和客户地址)的形式使用数据,而不必自己考虑存储这些数据的基础数据库表和列。借助实体框架,开发人员在处理数据时能够以更高的抽象级别工作,并且能够以相比传统应用程序更少的代码创建和维护面向数据的应用程序。
构建应用程序或服务时常用的一种长期存在的设计方法是将应用程序或服务分为三部分:域模型、逻辑模型和物理模型。域模型定义要建模的系统中的实体和关系。关系数据库的逻辑模型通过外键约束将实体和关系规范化到表中。物理模型通过指定分区和索引等存储详细信息实现特定数据引擎的功能。
物理模型由数据库管理员进行优化以改善性能,而编写应用程序代码的程序员的工作主要限制为通过编写 SQL 查询和调用存储过程来处理逻辑模型。域模型通常用作捕获和沟通应用程序要求的工具,常常以静态关系图形式提供,用于在项目早期阶段查看和讨论之用,随后会被弃用。许多开发团队会跳过概念模型的创建,直接从指定关系数据库中的表、列和键开始工作。
实体框架可使开发人员查询域模型(在实体框架中称为“概念”模型)中的实体和关系,同时依靠实体框架将这些操作转换为特定于数据源的命令,从而赋予模型生命。这使应用程序不再对特定数据源具有硬编码的依赖性。概念模型、存储模型以及这两者之间的映射以基于 XML 的架构表示,并在具有对应扩展名的文件中定义:
概念架构定义语言 (CSDL) 定义概念模型。CSDL 是实体框架对于 实体数据模型的实现。 文件扩展名为 .csdl。
存储架构定义语言 (SSDL) 定义存储模型,也称为“逻辑模型”。文件扩展名为 .ssdl。
映射规范语言 (MSL) 定义存储模型与概念模型之间的映射。文件扩展名为 .msl。
可以根据需要对存储模型和映射进行更改,而无需对概念模型、数据类或应用程序代码进行更改。存储模型是特定于提供程序的,因此可以在各种数据源之间使用一致的概念模型。
实体框架使用这些模型和映射文件将对概念模型中的实体和关系的创建、读取、更新和删除操作转换为数据源中的等效操作。实体框架甚至支持将概念模型中的实体映射到数据源中的存储过程。
面向对象的编程对与数据存储系统的交互提出了一个难题。虽然类的组织结构通常可以比较接近地反映关系数据库表的组织结构,但这种对应关系并不完美。多个规范化表通常对应于单个类,而且类间关系的表示方式与表间关系的表示方式通常也不相同。例如,若要表示某个销售订单的客户, Order 类可能会使用一个包含对 Customer 类实例的引用的属性,而数据库中的 Order 表行会包含一个外键列(或一组列),通过这些列包含对应于 Customer 表中的主键值的值。 Customer 类可能会使用一个名为 Orders 的属性(该属性包含 Order 类实例的集合),而数据库中的 Customer 表则不包含相应的列。 实体框架让开发人员可以灵活地采用此方式表示关系,或更贴切地对在数据库中表示的关系进行建模。
现有解决方案只能通过将面向对象的类和属性映射到关系表和列来尝试弥合这种通常称为“阻抗不匹配”的差异。实体框架 没有采用这种传统方法,而是将逻辑模型中的关系表、列和外键约束映射到概念模型中的实体和关系。这在定义对象和优化逻辑模型方面都增加了灵活性。实体数据模型 工具基于概念模型生成可扩展数据类。这些类是分部类,可以通过开发人员添加的其他成员进行扩展。默认情况下,为特定概念模型生成的类派生自基类,这些基类提供服务以将实体具体化为对象以及跟踪和保存更改。开发人员可以使用这些类像处理通过关联相关的对象一样处理实体和关系。开发人员还可以自定义针对某一概念模型生成的类。
实体框架不仅仅是另一种对象关系映射解决方案,从本质上讲,它的作用是使应用程序能够访问和更改概念模型中以实体和关系形式表示的数据。实体框架使用模型和映射文件中的信息将对概念模型中表示的实体类型的对象查询转换为特定于数据源的查询。查询结果具体化为实体框架管理的对象。实体框架为查询概念模型并返回对象提供了以下几种方式:
LINQ to Entities.提供语言集成查询 (LINQ) 支持,用于查询在概念模型中定义的实体类型。
Entity SQL.与存储无关的 SQL 方言,直接使用概念模型中的实体并支持实体数据模型概念。Entity SQL 可用于对象查询和通过使用 EntityClient 提供程序执行的查询。
查询生成器方法。这些方法让您可以使用 LINQ 风格的查询方法构造 Entity SQL 查询。
实体框架 中包含 EntityClient 数据提供程序。此提供程序管理连接,将实体查询转换为特定于数据源的查询,并返回实体框架用于将实体数据具体化为对象的数据读取器。当不需要对象具体化时,通过使应用程序执行 Entity SQL 查询并使用返回的只读数据读取器,还可以像使用标准 ADO.NET 数据提供程序一样使用 EntityClient 提供程序。
用于访问数据的实体框架体系结构如下图所示:
实体数据模型工具可生成一个从 ObjectContext 派生的类,该类表示概念模型中的实体容器。 此对象上下文提供跟踪更改以及管理标识、并发和关系的功能。此类还公开将插入、更新和删除操作写入数据源的 SaveChanges 方法。 与查询类似,这些更改是由系统自动生成的命令或由开发人员指定的存储过程执行的。
EntityClient 提供程序通过根据概念实体和关系访问数据来扩展 ADO.NET 提供程序模型。 它执行使用 Entity SQL 的查询。Entity SQL 提供使 EntityClient 能与数据库进行通信的基础查询语言。
实体框架 包含一个支持规范命令目录树的最新 SqlClient 数据提供程序。
除了实体框架运行时以外,.NET Framework 版本 4 还包含 EDM 生成器 (EdmGen.exe)。 该命令提示实用工具连接到数据源并基于实体与表之间的一对一映射生成模型和映射文件。另外,该实用工具还使用概念模型文件 (.csdl) 生成一个对象层文件,该文件包含表示实体类型和 ObjectContext 的类。
Visual Studio 2010 为在 Visual Studio 应用程序中生成和维护模型和映射文件提供了丰富的工具支持。实体数据模型 设计器支持创建高级映射方案,如每种类型一个表和每个层次结构一个表继承以及映射到多个表的拆分实体。
从MSDN上提供的这些信息可以看出ADO.NET Entity Framework 提供了一种简单的方式给开发人员方便的访问数据。
实体模型由三个部分组成:域模型、逻辑模型和物理模型。
在使用实体模型的时候,会产生三个对应的文件:概念架构定义语言(CSDL)定义的概念模型、存储架构定义语言 (SSDL) 定义的存储模型、映射规范语言 (MSL) 定义存储模型与概念模型之间的映射。这三个文件在我们编码的时候并没有直接看见,因为在项目中添加ADO.NET Entity Framework的时候会生成一个以edmx结尾的文件和对应的cs文件。上面所说的三个文件其实就包含在这两个文件中。
查询概念模型的时候有三种方式分别是:LINQ to Entities、Entity SQL、查询生成器方法。我个人比较喜欢LINQ TO Entities这种方式,因为Linq语法非常简单、易掌握、且功能强大。