Entity Framework 面试题

2025年3月17日 | 阅读 14 分钟

以下是大部分情况下会问到的 Entity Framework 面试题列表

1) Entity Framework 是什么意思?

Entity Framework (EF) 是一个开源的 **ORM (对象关系映射器)**,由微软提供。它允许开发者在 .NET 应用程序中处理对象,类似于处理其他领域特定的对象。它通过提供表格和列来简化软件中不同对象之间的映射。

该框架使用领域特定类别的对象,并提供自动存储和访问数据库中数据的功能。这个概念源自 MVC。然而,Entity Framework 并不关注用于存储数据的原始数据库列和表。这使得在创建新应用程序或维护现有应用程序时,更容易操作更高级别的抽象。


2) 为什么我们应该使用 Entity Framework?

编写和管理 ADO.NET 代码是一项棘手的任务。因此,微软引入了 Entity Framework 来使这项繁琐的任务更容易管理。Entity Framework 通过以领域特定对象的形式提供关系数据,大大减少了大量的代码工作。


3) 什么是 ADO.NET EF?

ADO.NET Entity Framework 是一个 ORM 框架,它允许我们处理不同的关系数据库,如 Oracle、MYSQL、SQL Server、DB2 等。它使我们能够将数据作为对象或实体来处理。

除此之外,ADO.NET 还帮助在 ADO.NET 组件之上创建高级抽象对象模型。这最终使我们能够使用高级领域对象,例如客户、供应商等。


4) 你将如何区分 ADO.NET 和 Entity Framework?

我们可以使用下表来区分 ADO.NET 和 Entity Framework

ADO.NET实体框架
ADO.NET 速度快。Entity Framework 相对较慢。
它创建了许多数据层代码。它不创建任何数据层代码。
它不自动创建数据访问层、中间层和映射代码。它自动创建数据访问层、中间层和映射代码。这最终有助于开发人员节省开发工作量和时间。

5) Entity Framework 的主要优点和缺点是什么?

优点

  • 它提供广泛的原型,有助于编写面向对象的代码。
  • 它包含自动迁移支持,有助于轻松快速地配置或管理数据库。
  • 它提供了许多备用命令,有助于缩短代码并使编码工作更加轻松。

缺点

  • 它被认为是速度较慢的 ORM 形式。
  • 如果用户不使用原始 SQL 代码,事情可能会变得困难。
  • 在复杂项目的情况下,它决定了整个模型的形状。此外,在没有 ORM 技术的情况下,无法清理模型。

6) 说明 Entity Framework 架构的主要组成部分。

以下是 Entity Framework 架构的主要组成部分

实体数据模型 (EDM):它包含三个部分,即存储模型、概念模型和映射。

Entity SQL:它是 Entity Framework 中使用的替代查询语言,与 L2E 一起使用。然而,L2E 相对更简单。

LINQ to Entities (L2E):它是一种查询语言,用于针对对象编写查询,这有助于根据概念模型中指定的定义检索实体。

Entity Client Data Provider:它被定义为帮助将 L2E 查询转换为 SQL 查询以便数据库轻松理解的层。此外,它可以与 ADO.NET 数据提供程序交互以从不同数据库传输或检索数据。

.NET Data Provider:这是另一个层,它有助于使用标准的 ADO.NET 与数据库进行交互。

Object Service:它是数据库的入口点,用于在需要时访问和返回数据。它有助于将来自实体客户端数据提供程序的转换为实体对象结构。


7) Entity Framework 的主要功能是什么?

以下是 EF 的主要功能

  • 它有助于将领域类映射到数据库模式转换。
  • 它跟踪实体的更改。
  • 它有助于将 LINQ 查询执行为 SQL。
  • 它将更改统计信息存储到数据库。

8) 在 Entity Framework 的上下文中,迁移的定义是什么?也请列出其类型。

Entity Framework 包含一个迁移工具,当模型发生变化时,该工具会自动帮助用户更新整个数据库。该工具在不丢失已存储数据或任何数据库对象的情况下更新数据库。

Entity Framework 中的迁移主要有两种类型

  • 自动迁移
  • 基于代码的迁移

9) Entity Framework 中用于加载相关实体的过程是什么?

我们可以使用以下任一过程来加载 Entity Framework 中的相关实体

延迟加载 (Lazy Loading):此过程会延迟加载相关对象,直到需要它们为止。延迟加载仅返回用户需要的对象,所有其他相关对象仅在过程中需要时返回。

预加载 (Eager Loading):此过程主要在查询对象时发生。预加载返回所有相关对象。此外,所有相关对象都会与父对象一起自动加载。

显式加载 (Explicit Loading):即使已经禁用延迟加载,也仅在我们希望使用延迟加载时才会发生此过程。要处理显式加载,我们需要显式调用相关实体上的相应加载方法。


10) Entity Framework 支持哪些不同类型的继承?

Entity Framework 主要支持三种类型的继承,例如

表分层 (Table per Hierarchy - TPH):此类型的继承为整个继承层次结构类表示单个表。此外,该表包含一个区分列,用于区分不同的继承类。它是 Entity Framework 中的默认继承映射技术。

表分类型 (Table per Type - TPT):此类型的继承为所有和每个领域类表示一个单独的或特定的表。

表分具体类 (Table per Concrete Class - TPC):此类型的继承为单个具体类表示单个表,但不包括抽象类。因此,如果抽象类被各种具体类继承,那么每个具体类的表将具有与抽象类相同的属性。


11) 实体数据模型 (Entity Data Model) 的主要组成部分是什么?

实体数据模型主要有三个部分,例如

  • 存储模型
  • 概念模型
  • 映射

12) 在 Entity Framework 的上下文中,模型是什么意思?

模型只不过是一个主要用于表示数据的类。在 EF 的上下文中,模型表示现有数据库中表的中的数据。

示例:以下代码显示了基本的客户模型


13) 你将如何区分 LINQ 和 Entity Framework?

我们可以借助下表来区分 LINQ 和 Entity Framework

LINQ实体框架
它仅通过 SQL Server 数据库进行操作。它拥有各种数据库,如 SQL Server、MYSQL、Oracle、DB2 等。
它支持实体类和关系表之间的一对一映射。它支持实体类和关系表之间的一对一、一对多和多对多映射类型。
它通过创建 .dbml 文件来维护关系。它首先创建 .edmx 文件。之后,它通过三种类型的文件维护关系:.ssdl、.msl 和 .csdl。
它不支持复杂类型。它支持复杂类型。
它无法通过模型生成数据库。它可以通过模型生成数据库。
它使用户能够通过 DataContext 查询数据。它允许用户通过 DbContext、ObjectContext 和 EntitySQL 查询数据。
它包含一个紧耦合的机制。它包含一个松散耦合的机制。
它主要用于使用 SQL Server 进行快速应用程序开发。它主要用于使用 SQL Server 和其他数据库(如 MYSQL、Oracle、DB2 等)进行快速应用程序开发。

14) 你将如何定义概念模型?

概念模型通常被定义为包含关系的类模型。这种类型的模型独立于数据库结构。


15) 你将如何解释存储模型?

存储模型通常解释为数据库设计模型,其中包含数据库表、存储过程、视图和具有关系的键。


16) 你对 EDM 有何理解?创建 EDM 的过程是什么?

EF 中的 EDM 是“实体数据模型”的简称。它被定义为实体-关系原型,通过各种建模过程帮助分配数据的基本原型。此外,它也被称为一组核心原则,这些原则定义了数据,而忽略了其聚合形式。简而言之,它只是数据库和原型之间形成的一个简单连接。

以下是创建实体数据模型的步骤

  • 首先,我们需要在解决方案资源管理器选项卡中右键单击项目名称。
  • 接下来,我们需要从菜单中选择“添加新项”。
  • 之后,我们需要选择 ADO.NET Entity Data Model 约定或任何模板。
  • 最后,我们必须为模型指定一个名称,然后单击“添加”按钮。

这样,我们就可以在 Entity Framework 中创建 EDM 了。


17) 列出使用 Entity Framework 从 MVC 数据库检索数据的所需所有步骤。

以下是使用 Entity Framework 从 MVC 中的数据库检索数据的步骤

  • 首先,我们需要创建一个新项目。
  • 接下来,我们需要从 NuGet 包管理器添加 Entity Framework 引用。
  • 然后,我们需要在模型中创建一个新类,位于表结构内部。
  • 之后,我们需要在 web.config.connection 中添加连接字符串。它应该与上下文匹配。
  • 接下来,我们需要打开 Global.asax.cs 文件,实现 EF 的新命名空间。然后,我们需要初始化数据库。
  • 现在我们需要右键单击 Controller 文件夹,并添加一个新控制器,同时在命名空间部分添加模型引用。
  • 最后,我们需要右键单击控制器名称,并添加我们想要检索的节。

这样,我们就可以在 MVC 中使用 EF 从数据库中查看或检索数据了。


18) DbContext 和 DbSet 是什么意思?

DbContext 被称为 Entity Framework API 中的一个类,它帮助在数据库和域/实体类之间建立通信。简而言之,它是一个主要用于与数据库通信的类。

DbSet 也被称为一个类,它帮助为不同的操作(如创建、更新、读取和删除)表示一个实体集。DbContext 中的上下文类必须包含所有这些实体的 DbSet 类型属性,这些属性有助于连接数据库表和视图。


19) 在 Entity Framework 的上下文中,POCO 类的定义是什么?

POCO 是“Plain Old CLR Objects”的缩写。然而,这并不意味着这里使用的类是朴素的或旧的。POCO 类通常被定义为不包含任何特定于 EF 或 .NET 框架引用的类。POCO 实体被称为 Entity Framework 应用程序中可用的领域对象。

与标准的 .NET 类不同,任何对象的 POCO 类都独立于特定于框架的基类。POCO 类支持 Entity Object 的派生实体所支持的各种 LINQ 查询。


20) Entity Framework 中使用的不同类型的方法是什么?

Entity Framework 中主要有三种类型的方法,例如

  • 模型优先方法
  • 代码优先方法
  • 数据库优先方法

21) 如何定义代码优先方法和模型优先方法?也请列出它们的优点。

代码优先方法 (Code First Approach):在 Entity Framework 中,代码优先方法主要用于使用类创建模型及其关系,这些类进一步用于创建数据库。这使得开发人员能够以面向对象的方式工作,而无需考虑数据库的结构。在这种方法中,开发人员首先编写 POCO 类,然后使用这些 POCO 类创建数据库。大多数遵循领域驱动设计 (DDD) 技术的开发人员都使用代码优先方法。

代码优先方法的优点

  • 它允许开发人员根据业务对象决定数据库结构,这对小型应用程序更有益。
  • 它使开发人员能够决定哪些类应该被序列化。它还允许我们指定要预加载的集合。

模型优先方法 (Model First Approach):另一方面,模型优先方法用于使用 ORM 创建模型类及其关系。一旦模型类和关系成功创建,就通过这些模型创建物理数据库。

模型优先方法的优点

  • 它为单独设计实体模型提供了灵活性,并提供了在后续阶段改进它们的选项。
  • 它不使用很多数据库,因为我们可以通过使用 EDMX 设计器绘制来创建模型类。

22) 定义数据库优先方法。

在 Entity Framework 方面,数据库优先方法是从可用数据库生成实体模型的方法。这种方法的主要目的是减少需要编写的代码量。这种方法主要有助于基于现有类创建域类和上下文类。


23) 在你看来,哪种方法是 Entity Framework 中最好的方法?

Entity Framework 中没有一种特定方法可以称为最佳方法。开发方法的选择主要取决于项目需求和项目类型。如果数据库已存在,则使用数据库优先方法是很好的。如果不存在数据库和模型类,则模型优先方法是最佳选择。如果存在领域类,则代码优先方法是最合适的选择。


24) 在 Entity Framework 的上下文中,定义 .edmx 文件。

在 Entity Framework 的上下文中,.edmx 文件是一个简单的 XML 文件,可能包含存储模型、概念模型以及它们之间的映射。它包含对象如何映射到 SQL 表的所有映射信息。此外,它可能包含 ADO.NET Entity Data Designer 用于图形化渲染模型所需的信息。


25) 什么是数据库并发,以及如何处理它?

EF 的数据库并发定义为多个用户同时访问和修改同一数据库中的相同数据的情况。保护此类情况下数据一致性的系统称为并发控制。

数据库并发通常通过实现乐观锁定来处理。要实现锁定,我们必须首先右键单击 EDMX 设计器,然后将并发模式设置为“固定”。进行此更改后,如果存在并发问题,我们将收到一个正面并发异常错误。


26) Entity Framework 支持哪些不同类型的属性?

Entity Framework 主要支持三种类型的属性,例如

  • 导航属性
  • 复杂属性
  • 标量属性

27) 在 Entity Framework 中,映射的定义是什么?

Entity Framework 中的映射被定义为解释概念模型如何映射到存储模型的*.信息。


28) 你对 LINQ to Entities 有何理解?

LINQ to Entities (L2E) 被定义为 Entity Framework 中一种流行的查询语言。L2E 主要有助于针对对象编写查询,以根据概念模型的定义检索实体。


29) 你对 Entity SQL 有何理解?

Entity SQL 是一种与 LINQ to Entities 类似的替代查询语言。然而,它比 LINQ to Entities 更复杂。希望使用此语言的开发人员将需要单独学习它。


30) Pluralize 和 Singularize 在 Entity Framework 中有什么作用?

在 Entity Framework 中,Pluralize 和 Singularize 主要负责为对象分配有意义的命名约定。添加 .edmx 文件时,我们可以访问此功能。使用此功能时,Entity Framework 将分配单数或复数编码约定。如果对象中有多个记录,则在给出约定名称时会添加一个额外的“s”。


31) 用于在 Entity Framework 中执行纯 SQL 的方法是什么?

以下是用于在 Entity Framework 中执行纯 SQL 的方法

  • SqlQuery()
  • Database.SqlQuery()
  • Database.ExecuteSqlCommand()

32) 你对 SQL 注入攻击有何理解?

SQL 注入攻击涉及攻击者窃取组织数据库中的机密信息。此类攻击通常通过将 SQL 命令添加到基于 SQL 语句的现有应用程序的代码中来完成。这是一种应用程序层攻击,即前端攻击,因为攻击者使用并修改现有的、编码不当的代码。

SQL 注入攻击通常通过用户输入的可用字段进行插入。发生这种情况是因为这些字段允许 SQL 语句通过它们直接查询数据库。SQL 注入问题是 ADO.NET 数据服务查询的常见问题。此外,Entity Framework 是安全的,因为它每次都会创建参数化 SQL 命令来保护数据库免受 SQL 注入。另外,开发人员永远不应将用户输入与 Entity SQL 命令文本结合。这将增加额外的安全层。


33) 在 Entity Framework 的上下文中,定义导航属性。

在 Entity Framework 中,导航属性用于表示数据库中的外键关系。这种类型的属性允许用户在数据库中的实体之间分配特定的关系。关系被定义为在面向对象语言中保持连贯。


34) 你对 Entity Framework 中的 ComplexType 有何了解?

在 Entity Framework 中,ComplexType 是实体类型的非标量属性。这种类型的属性帮助用户在实体之间分配标量关系。


35) 列出一些可以与 .NET 应用程序一起使用的 ORM 名称。

以下列出的 ORM 可以与 .NET 应用程序一起使用

  • Entity Framework 6.x
  • Entity Framework Core
  • N Hibernate
  • Dapper

36) 你将如何解释 Micro O/RMs?

Micro ORM 的设计侧重于处理数据库表的基本任务,而不是创建数据库架构、修改数据库架构、跟踪更改等。Entity Framework 6.x 和 Entity Framework core 被称为 ORM,因为它们提供了一整套功能。


37) Dapper 是什么意思?

Dapper 是一个简单的微 ORM,它帮助将原生查询的输出映射到域或任何 C# 类。它是 .NET 世界中用于数据访问的功能强大的系统。Dapper 由 StackOverflow 团队开发,并作为开源项目发布。它包含一个 NuGet 库,可以轻松地将其集成到任何基于数据库操作的 .NET 项目中。


38) 我们能做些什么来提高 Entity Framework 的性能?

我们可以通过以下方式提高 Entity Framework 的性能

  • 我们可以在需要时使用编译后的查询。
  • 我们应避免使用 Views 和 Contains。
  • 当实体不需要跟踪时,我们可以禁用并更改跟踪。
  • 我们可以调试和优化 LINQ 查询。
  • 如果不是必须的,我们应尽量避免获取所有字段。
  • 在将数据绑定到网格时,我们应仅检索所需数量的记录。

39) Entity Framework 中的 Object Set 是什么意思?

Object set 是一种特定的实体集,可用于从任何现有实体执行读取、更新、创建和删除操作。它只能通过 Object Context 实例创建。它不支持任何 Entity SQL 方法。


40) Entity Framework 中存在哪些不同的实体状态?

每个实体在其生命周期中都具有特定的状态。各种状态由一个枚举(称为 EntityState)定义,后面跟着一个特定的值,例如 added、deleted、modified、detached 或 unchanged。