实体框架概述

实体框架 是 ADO.NET 中的一套支持开发面向数据的软件应用程序的技术。 面向数据的应用程序的架构师和开发人员曾为实现两个迥然不同的目标费尽心机: 他们必须为要解决的业务问题的实体、关系和逻辑构建模型,还必须处理用于存储和检索数据的数据引擎。 数据可能跨多个各有不同协议的存储系统;甚至使用单个存储系统的应用程序也必须在存储系统的要求与编写高效且容易维护的应用程序代码之间取得平衡。

实体框架 使开发人员可以采用特定于域的对象和属性(如客户和客户地址)的形式使用数据,而不必自己考虑存储这些数据的基础数据库表和列。 借助实体框架 ,开发人员在处理数据时能够以更高的抽象级别工作,并且能够以相比传统应用程序更少的代码创建和维护面向数据的应用程序。 由于实体框架 是 .NET Framework 的一个组件,因此实体框架 应用程序可以在任何安装了 .NET Framework 3.5 SP1 以上版本的计算机上运行。

本主题中的下面各节将更详细地介绍实体框架 :

  • Giving Life to Models

  • Mapping Objects to Data

  • Accessing and Changing Entity Data

  • Data Providers

  • Entity Data Model Tools

  • Learning More

赋予模型生命

构建应用程序或服务时常用的一种长期存在的设计方法是将应用程序或服务分为三部分:域模型、逻辑模型和物理模型。 域模型定义要建模的系统中的实体和关系。 关系数据库的逻辑模型通过外键约束将实体和关系规范化到表中。 物理模型通过指定分区和索引等存储详细信息实现特定数据引擎的功能。

物理模型由数据库管理员进行优化以改善性能,而编写应用程序代码的程序员的工作主要限制为通过编写 SQL 查询和调用存储过程来处理逻辑模型。 域模型通常用作捕获和沟通应用程序要求的工具,常常以静态关系图形式提供,用于在项目早期阶段查看和讨论之用,随后会被弃用。 许多开发团队会跳过概念模型的创建,直接从指定关系数据库中的表、列和键开始工作。

实体框架 可使开发人员查询域模型(在实体框架 中称为“概念”**模型)中的实体和关系,同时依靠实体框架 将这些操作转换为特定于数据源的命令,从而赋予模型生命。 这使应用程序不再对特定数据源具有硬编码的依赖性。 概念模型、存储模型以及这两者之间的映射以基于 XML 的架构表示,并在具有对应扩展名的文件中定义:

  • 概念架构定义语言 (CSDL) 定义概念模型。 CSDL 是实体框架 对于实体数据模型的实现。 文件扩展名为 .csdl。

  • 存储架构定义语言 (SSDL) 定义存储模型,也称为“逻辑模型”。 文件扩展名为 .ssdl。

  • 映射规范语言 (MSL) 定义存储模型与概念模型之间的映射。 文件扩展名为 .msl。

可以根据需要对存储模型和映射进行更改,而无需对概念模型、数据类或应用程序代码进行更改。 存储模型是特定于提供程序的,因此可以在各种数据源之间使用一致的概念模型。

实体框架 使用这些模型和映射文件将对概念模型中的实体和关系的创建、读取、更新和删除操作转换为数据源中的等效操作。 实体框架 甚至支持将概念模型中的实体映射到数据源中的存储过程。 有关更多信息,请参见 CSDL、SSDL 和 MSL 规范

将对象映射到数据

面向对象的编程对与数据存储系统的交互提出了一个难题。 虽然类的组织结构通常可以比较接近地反映关系数据库表的组织结构,但这种对应关系并不完美。 多个规范化表通常对应于单个类,而且类间关系的表示方式与表间关系的表示方式通常也不相同。 例如,若要表示某个销售订单的客户,Order 类可能会使用一个包含对 Customer 类实例的引用的属性,而数据库中的 Order 表行会包含一个外键列(或一组列),通过这些列包含对应于 Customer 表中的主键值的值。 Customer 类可能会使用一个名为 Orders 的属性(该属性包含 Order 类实例的集合),而数据库中的 Customer 表则不包含相应的列。 实体框架 让开发人员可以灵活地采用此方式表示关系,或更贴切地对在数据库中表示的关系进行建模。 有关更多信息,请参见定义和管理关系(实体框架)

现有解决方案只能通过将面向对象的类和属性映射到关系表和列来尝试弥合这种通常称为“阻抗不匹配”的差异。 实体框架 没有采用这种传统方法,而是将逻辑模型中的关系表、列和外键约束映射到概念模型中的实体和关系。 这在定义对象和优化逻辑模型方面都增加了灵活性。 实体数据模型 工具基于概念模型生成可扩展数据类。 这些类是分部类,可以通过开发人员添加的其他成员进行扩展。 默认情况下,为特定概念模型生成的类派生自基类,这些基类提供服务以将实体具体化为对象以及跟踪和保存更改。 开发人员可以使用这些类像处理通过关联相关的对象一样处理实体和关系。 开发人员还可以自定义针对某一概念模型生成的类。 有关更多信息,请参见 使用对象(实体框架)How to: Customize Object-Layer Code Generation

访问和更改实体数据

实体框架 不仅仅是另一种对象关系映射解决方案,从本质上讲,它的作用是使应用程序能够访问和更改概念模型中以实体和关系形式表示的数据。 实体框架 使用模型和映射文件中的信息将对概念模型中表示的实体类型的对象查询转换为特定于数据源的查询。 查询结果具体化为实体框架 管理的对象。 实体框架 为查询概念模型并返回对象提供了以下几种方式:

  • 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 方法。 与查询类似,这些更改是由系统自动生成的命令或由开发人员指定的存储过程执行的。 有关更多信息,请参见创建、添加、修改和删除对象(实体框架)

数据提供程序

EntityClient 提供程序通过根据概念实体和关系访问数据来扩展 ADO.NET 提供程序模型。 它执行使用 Entity SQL 的查询。 Entity SQL 提供使 EntityClient 能与数据库进行通信的基础查询语言。 有关更多信息,请参见 用于实体框架的 EntityClient 提供程序

实体框架 包含一个支持规范命令目录树的最新 SqlClient 数据提供程序。 有关更多信息,请参见用于实体框架的 SQL Server .NET Framework 数据提供程序 (SqlClient)

实体数据模型工具

除了实体框架 运行时以外,.NET Framework 版本 4 还包含 EDM 生成器 (EdmGen.exe)。 该命令提示实用工具连接到数据源并基于实体与表之间的一对一映射生成模型和映射文件。 另外,该实用工具还使用概念模型文件 (.csdl) 生成一个对象层文件,该文件包含表示实体类型和 ObjectContext 的类。 有关更多信息,请参见 EDM 生成器 (EdmGen.exe)

Visual Studio 2010 为在 Visual Studio 应用程序中生成和维护模型和映射文件提供了丰富的工具支持。 实体数据模型 设计器支持创建高级映射方案,如每种类型一个表和每个层次结构一个表继承以及映射到多个表的拆分实体。 有关更多信息,请参见 ADO.NET Entity Data Model Designer

了解更多信息

通过以下主题可以了解有关 实体框架 的更多信息:

  • 实体框架术语
    定义由实体数据模型和实体框架 引入以及在实体框架 文档中使用的许多术语。
  • 实体框架资源
    提供指向概念性主题的链接以及有关构建 实体框架 应用程序的外部主题和资源的链接。

另请参见

概念

ADO.NET 实体框架