实体框架概述

Entity Framework 是一组 ADO.NET 技术,支持开发面向数据的软件应用程序。 面向数据的应用程序的架构师和开发人员一直难以实现两个非常不同的目标。 它们必须对所解决的业务问题的实体、关系和逻辑进行建模,并且还必须使用用于存储和检索数据的数据引擎。 数据可以跨越多个存储系统,每个存储系统都有其自己的协议;即使是使用单个存储系统的应用程序也必须根据编写高效且可维护的应用程序代码的要求平衡存储系统的要求。

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

为模型赋予生命

生成应用程序或服务时,一种长期且常见的设计方法是将应用程序或服务划分为三个部分:域模型、逻辑模型和物理模型。 域模型定义正在建模的系统中的实体和关系。 关系数据库的逻辑模型将实体和关系规范化为具有外键约束的表。 物理模型通过指定存储详细信息(如分区和索引)来解决特定数据引擎的功能。

物理模型由数据库管理员优化以提高性能,但编写应用程序代码的程序员主要通过编写 SQL 查询和调用存储过程来限制自己使用逻辑模型。 域模型通常用作捕获和传达应用程序需求的工具,通常是静态图表,在项目的早期阶段被查看和讨论,随后被搁置。 许多开发团队跳过创建概念模型,首先在关系数据库中指定表、列和键。

实体框架通过使开发人员能够查询域模型中的实体和关系(称为实体框架中的 概念 模型),同时依赖实体框架将这些作转换为数据源特定的命令,从而为模型提供生命。 这会释放应用程序对特定数据源的硬编码依赖项。

使用 Code First 时,概念模型将映射到代码中的存储模型。 Entity Framework 可以根据定义的对象类型和其他配置推断概念模型。 映射元数据是在运行时根据您如何定义域类型的方式以及您在代码中提供的其他配置信息的组合生成的。 Entity Framework 会根据需要根据元数据生成数据库。 有关详细信息,请参阅 创建模型

使用实体数据模型工具时,概念模型、存储模型和两者之间的映射以基于 XML 的架构表示,并在具有相应名称扩展名的文件中定义:

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

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

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

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

Entity Framework 使用这些模型和映射文件,在概念模型中的实体和关系上创建、读取、更新和删除操作,以将这些操作映射为数据源中的等效操作。 Entity Framework 甚至支持将概念模型中的实体映射到数据源中的存储过程。 有关详细信息,请参阅 CSDL、SSDL 和 MSL 规范

将对象映射到数据

面向对象的编程对与数据存储系统交互带来了挑战。 虽然类的组织经常反映关系数据库表的组织,但拟合并不完美。 多个规范化表通常对应于单个类,并且类之间的关系通常表示方式不同于表示表之间的关系。 例如,为了表示销售订单的客户,Order 类可能使用包含对 Customer 类实例引用的属性,而数据库中的 Order 表行包含外键列(或列集),其值对应于 Customer 表中的主键值。 类 Customer 可能具有一个名为 Orders 的属性,该属性包含 Order 类实例的集合,而数据库中的 Customer 表则没有对应的列。 Entity Framework 为开发人员提供了选择,可以灵活地以这种方式表示关系,或者更贴近它们在数据库中的表示来建模关系。

现有的解决方案试图弥合这种通常被称为“阻抗失配”的差距,方法是仅将面向对象的类和属性映射到关系表和列。 Entity Framework 不会采用这种传统方法,而是将逻辑模型中的关系表、列和外键约束映射到概念模型中的实体和关系。 这样就可以在定义对象和优化逻辑模型方面具有更大的灵活性。 实体数据模型工具基于概念模型生成可扩展数据类。 这些类是可以扩展的部分类,开发人员可以添加其他成员。 默认情况下,为特定概念模型生成的类派生自基类,这些基类提供将实体具体化为对象以及跟踪和保存更改的服务。 开发人员可以使用这些类来处理通过关联连接的对象形式的实体和关系。 开发人员还可以自定义为概念模型生成的类。 有关详细信息,请参阅使用对象

访问和更改实体数据

实体框架不仅仅是另一个对象关系映射解决方案,它基本上就是使应用程序能够访问和更改在概念模型中表示为实体和关系的数据。 Entity Framework 使用模型和映射文件中的信息,将对概念模型中实体类型的对象查询翻译为特定于数据源的查询。 查询结果具体化为 Entity Framework 管理的对象。 Entity Framework 提供了以下方法来查询概念模型并返回对象:

  • LINQ to Entities。 提供语言集成查询 (LINQ) 支持,用于查询在概念模型中定义的实体类型。 有关详细信息,请参阅 LINQ to Entities

  • 实体 SQL。 与存储无关的 SQL 方言,它直接与概念模型中的实体一起使用,并支持实体数据模型概念。 实体 SQL 既用于对象查询,也用于通过 EntityClient 提供程序执行的查询。 有关详细信息,请参阅 实体 SQL 概述

Entity Framework 包括 EntityClient 数据提供程序。 此提供程序管理连接,将实体查询转换为特定于数据源的查询,并返回实体框架用于将实体数据具体化为对象的数据读取器。 当不需要对象具体化时,EntityClient 提供程序还可以像标准 ADO.NET 数据提供程序一样使用,方法是使应用程序能够执行实体 SQL 查询并使用返回的只读数据读取器。 有关详细信息,请参阅 用于 Entity Framework 的 EntityClient 提供程序

下图演示了用于访问数据的 Entity Framework 体系结构:

实体框架体系结构关系图

实体数据模型工具可以生成派生自 System.Data.Objects.ObjectContextSystem.Data.Entity.DbContext 表示概念模型中的实体容器的类。 此对象上下文提供用于跟踪更改和管理标识、并发和关系的设施。 此类还公开将插入、更新和删除操作写入数据源的 SaveChanges 方法。 与查询一样,这些更改由系统自动生成的命令或由开发人员指定的存储过程进行。

数据提供者

EntityClient 提供程序通过以概念实体和关系的方式访问数据,从而扩展了 ADO.NET 提供程序模型。 它执行使用实体 SQL 的查询。 实体 SQL 提供基础查询语言,可用于 EntityClient 与数据库通信。 有关详细信息,请参阅 用于 Entity Framework 的 EntityClient 提供程序

实体框架包含一个更新的 SqlClient 数据提供程序,该提供程序支持规范命令树。 有关详细信息,请参阅 Entity Framework 的 SqlClient

实体数据模型工具

Visual Studio 与 Entity Framework 运行时一起包括映射和建模工具。 有关详细信息,请参阅 建模和映射

了解详细信息

若要了解有关实体框架的详细信息,请参阅:

入门 - 提供有关如何使用快速入门快速启动和运行的信息,该 快速入门演示如何创建简单的 Entity Framework 应用程序。

实体框架术语 - 定义实体数据模型和实体框架以及实体框架文档中引入的许多术语。

Entity Framework 资源 - 提供概念主题的链接,以及用于生成 Entity Framework 应用程序的外部主题和资源的链接。

另请参阅