C中使用EntityFrameworkCore进行数据交互
立即解锁
发布时间: 2025-08-25 01:04:34 阅读量: 2 订阅数: 8 

### C# 中使用 Entity Framework Core 进行数据交互
#### 1. 技术要求
要学习相关内容,需要安装 Visual Studio 2017 或 2019 免费社区版或更高版本,并安装所有数据库工具。所有概念将通过基于某个实际用例的实践示例进行说明,代码可在 https://github.com/PacktPublishing/Hands-On-Software-Architecture-with-CSharp-8 找到。
#### 2. 理解 ORM 基础
ORM(对象关系映射)工具将关系型数据库表映射到内存中的对象集合,其中对象属性对应数据库表字段。以下是一些类型映射的规则:
| C# 类型 | 数据库类型映射 |
| ---- | ---- |
| 布尔型、数值类型、字符串 | 有对应的数据库类型 |
| GUID | 若数据库不支持,映射为等效字符串表示 |
| 日期和时间类型 | 无 timezone 信息映射为 C# DateTime,有则映射为 DateTimeOffset |
| 数据库时间间隔 | 映射为 TimeSpan |
由于面向对象语言的字符串属性通常无长度限制,而数据库字符串字段有,所以在数据库映射配置中需考虑这些限制。Entity Framework Core 提供了三种配置方式:
- 数据注解(属性特性)
- 命名约定
- 基于配置对象和方法的流畅配置接口
其中,流畅接口可用于指定任何配置选项,而数据注解和命名约定只能用于较小的子集。
每个 ORM 通过称为“提供者”或“连接器”的特定于数据库的适配器来适配特定的数据库类型(如 Oracle、MySQL、SQL Server 等)。Entity Framework Core 为大多数可用的数据库引擎提供了提供者,完整列表可在 https://docs.microsoft.com/en-US/ef/core/providers/ 找到。
表之间的关系用对象指针表示。例如,在一对多关系中,映射到“一”端的类包含一个集合,该集合填充了“多”端的相关对象;而映射到“多”端的类有一个简单属性,填充了“一”端的唯一相关对象。
整个数据库(或其一部分)由一个内存缓存类表示,该类为每个映射到数据库表的集合包含一个属性。首先在内存缓存类的实例上执行查询和更新操作,然后将该实例与数据库同步。Entity Framework Core 使用的内存缓存类称为 `DBContext`,它还包含映射配置。具体来说,特定于应用程序的内存缓存类通过继承 `DBContext` 并添加所有映射集合和必要的配置信息来获得。
数据库查询使用由对内存缓存类集合的方法调用组成的查询语言执行。实际的 SQL 在同步阶段创建和执行。例如,Entity Framework Core 对映射到数据库表的集合执行语言集成查询(LINQ)。LINQ 查询通常产生 `IEnumerable` 实例,即元素在查询结束创建 `IEnumerable` 时不计算,而是在实际尝试从 `IEnumerable` 检索集合元素时计算。具体流程如下:
```mermaid
graph LR
A[从 DBContext 映射集合开始的 LINQ 查询] --> B[创建 IQueryable 子类]
B --> C[IQueryable 包含查询数据库所需信息]
C --> D[检索 IQueryable 第一个元素时生成并执行 SQL]
```
通常,每个 Entity Framework 查询以 `ToList` 或 `ToArray` 操作结束,将 `IQueryable` 转换为列表或数组,从而导致在数据库上实际执行查询。如果查询预期只返回单个元素或不返回任何元素,通常执行 `FirstOrDefault` 操作,返回单个元素(如果有)或 `null`。
更新、删除和向数据库表添加新实体是通过在表示数据库表的 `DBContext` 集合属性上模拟这些操作来执行的。但实体只有在通过查询加载到内存集合中后才能以这种方式更新或删除。更新查询需要根据需要修改实体的内存表示,而删除查询需要从其内存映射集合中移除实体的内存表示。在 Entity Framework Core 中,移除操作通过调用集合的 `Remove(entity)` 方法执行。添加新实体只需将其添加到内存集合中。在不同内存集合上执行的更新、删除和添加操作通过显式调用数据库同步方法实际传递到数据库。例如,当调用 `DBContext.SaveChanges()` 方法时,Entity Framework Core 将对 `DBContext` 实例执行的所有更改传递到数据库。同步操作期间传递到数据库的更改在单个事务中执行。
#### 3. 配置 Entity Framework Core
由于数据库处理局限于专用应用层,因此在单独的库中定义 Entity Framework Core(`DBContext`)是一种好的做法。需要定义一个 .NET Core 类库项目。有 .NET Standard 和 .NET Core 两种不同类型的库项目:
- .NET Core 库与特定的 .NET Core 版本绑定。
- .NET Standard 2.0 库应用范围广泛,可与任何大于 2.0 的 .NET 版本以及经典的 .NET Framework 一起使用。
但所需的 `Microsoft.EntityFrameworkCore` 包仅依赖于 .NET Standard 2.0,它是为特定的 .NET Core 版本设计的。如果将数据库层定义为 .NET Standard 2.0,添加的特定 `Microsoft.EntityFrameworkCore` 包可能会与另一个绑定到特定 .NET Core 版本的系统组件中包含的同一库的其他版本冲突。由于这里的库不是通用库,只是特定应用程序的一个组件,因此最好将其绑定到特定的 .NET Core 版本。以下是创建和准备 .NET Core 库项目的步骤:
1. 打开 Visual Studio,定义一个名为 `WWTravelClubDB` 的新解决方案,然后选择可用的最新 .NET Core 版本的“类库(.NET Core)”。
2. 安装所有与 Entity Framework Core 相关的依赖项。最简单的方法是添加要使用的数据库引擎的提供者的 NuGet 包,这里使用 SQL Server,添加最新稳定版本的 `Microsoft.EntityFrameworkCore.SqlServer`。如果计划使用多个数据库引擎,也可以添加其他提供者,它们可以并行工作。
3. 将默认的 `Class1` 类重命名为 `MainDBContext`。
4. 用以下代码替换其内容:
```csharp
using System;
using Microsoft.EntityFrameworkCore;
namespace WWTravelClubDB
{
public class MainDBContext: DbContext
{
public MainDBContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder
builder)
{
}
}
}
```
5. 继承自 `DbContext` 并向 `DBContext` 构造函数传递 `DbContextOptions`,其中包含创建选项,如依赖于目标数据库引擎的数据库连接字符串。
6. 所有映射到数据库表的集合将作为 `MainDBContext` 的属性添加。映射配置将在重写的 `OnModelCreating` 方法中借助作为参数传递的 `ModelBuilder` 对象定义。
下一步是创建表示所有数据库表行的类,即实体。为要映射的每个数据库表创建一个实体类,并在项目根目录创建一个 `Models` 文件夹存放这些类。
#### 4. 定义数据库实体
数据库设计和整个
0
0
复制全文
相关推荐










