深入探究DbContext
立即解锁
发布时间: 2025-08-23 01:42:05 阅读量: 1 订阅数: 7 

### 深入探究 DbContext
在使用数据库时,DbContext 是一个关键组件,它提供了许多用于管理实体类和与数据库交互的属性和方法。本文将深入探讨 DbContext 的相关内容,包括其属性、实体状态的跟踪和更改等。
#### 1. DbContext 类属性概述
应用程序中的 DbContext 继承自 EF Core 的 DbContext 类,是访问数据库的关键。以下是 DbContext 类的四个主要公共属性及其相关功能:
| 属性 | 功能 |
| ---- | ---- |
| ChangeTracker | 提供对 EF Core 更改跟踪代码的访问。可用于在调用 `SaveChanges` 之前进行数据验证。 |
| ContextId | DbContext 实例的唯一标识符,主要用于日志记录和调试,方便查看同一实例的读写操作。 |
| Database | 提供三组主要功能:事务控制、数据库创建/迁移和原始 SQL 命令执行。 |
| Model | 提供对 EF Core 连接或创建数据库时使用的数据库模型的访问。 |
#### 2. 理解 EF Core 如何跟踪更改
EF Core 为所有跟踪的实体附加了一个名为 `State` 的属性,该属性是 `EntityState` 类型的枚举,用于表示当调用 `SaveChanges` 方法时,对该实体的操作意图。以下是 `State` 属性的可能值:
- **Added**:实体在数据库中尚不存在,调用 `SaveChanges` 时将插入该实体。
- **Unchanged**:实体存在于数据库中,且在客户端未被修改,`SaveChanges` 将忽略该实体。
- **Modified**:实体存在于数据库中,且在客户端被修改,`SaveChanges` 将更新该实体。
- **Deleted**:实体存在于数据库中,但应被删除,`SaveChanges` 将删除该实体。
- **Detached**:提供的实体未被跟踪,`SaveChanges` 不会处理该实体。
实体状态的变化过程可以用以下流程图表示:
```mermaid
graph LR
A[Detached] --> B[Added]
B --> C[Unchanged]
C --> D[Modified]
D --> C
C --> E[Deleted]
E --> A
```
当实体处于 `Modified` 状态时,还会涉及一个 per - property 的布尔标志 `IsModified`,用于标识实体中哪些属性(标量和导航属性)发生了变化。访问标量属性的 `IsModified` 属性的方式如下:
```csharp
context.Entry(entity).Property("PropertyName").IsModified
```
访问导航属性的 `IsModified` 属性的方式如下:
```csharp
context.Entry(entity).Navigation("PropertyName").IsModified
```
#### 3. 改变实体状态的命令
以下是可以改变跟踪实体状态的 EF Core 命令/操作:
| 命令/操作 | 示例 | 最终状态 |
| ---- | ---- | ---- |
| Add/AddRange | `context.Add(entity);` | Added |
| Remove/RemoveRange | `context.Remove(entity);` | Deleted |
| 更改属性 | `entity.MyString = “hello”;` | Modified |
| Update/UpdateRange | `context.Update(entity);` | Modified |
| Attach/AttachRange | `context.Attach(entity);` | Unchanged |
| 直接设置状态 | `context.Entry(entity).State = …` | 给定状态 |
| 通过 TrackGraph 设置状态 | `context.ChangeTracker.TrackGraph
0
0
复制全文
相关推荐










