185 lines
5.5 KiB
Markdown
185 lines
5.5 KiB
Markdown
# Sharp.Data 测试演示说明
|
||
|
||
## 概述
|
||
|
||
本测试项目不仅是单元测试,更是 **Sharp.Data 模块的完整使用演示**。通过这些测试,您可以学习如何在实际项目中使用 Sharp.Data。
|
||
|
||
## 测试文件说明
|
||
|
||
| 文件 | 说明 | 主要演示内容 |
|
||
|--------------------------------|----------------|-----------------|
|
||
| `TestEntities.cs` | 实体定义演示 | 6种不同的实体定义方式 |
|
||
| `TestDbContext.cs` | DbContext 配置演示 | 如何配置各种实体 |
|
||
| `01_BasicUsageTests.cs` | 基础使用 | 3行代码快速开始、各种配置选项 |
|
||
| `02_RepositoryCRUDTests.cs` | 仓储 CRUD | 增删改查、批量操作、复杂查询 |
|
||
| `03_AuditFeatureTests.cs` | 审计功能 | 自动记录创建/修改信息 |
|
||
| `04_SoftDeleteTests.cs` | 软删除功能 | 逻辑删除 vs 物理删除 |
|
||
| `05_PaginationTests.cs` | 分页查询 | 各种分页场景 |
|
||
| `06_CustomEntityTests.cs` | 自定义实体 | 不使用基类的灵活方式 |
|
||
| `07_EFCoreDirectUsageTests.cs` | EF Core 直接使用 | 原生 SQL、事务、高级查询 |
|
||
|
||
## 运行测试
|
||
|
||
```bash
|
||
# 运行所有测试
|
||
dotnet test D:\yuanll\sharp-basic\test\Data.Test\Data.Test.csproj
|
||
|
||
# 运行特定测试类
|
||
dotnet test --filter "FullyQualifiedName~_01_BasicUsageTests"
|
||
|
||
# 运行特定测试方法
|
||
dotnet test --filter "Name~Demo_MinimalSetup"
|
||
```
|
||
|
||
## 主要演示场景
|
||
|
||
### 1. 实体定义方式(TestEntities.cs)
|
||
|
||
演示了 6 种实体定义方式,满足不同需求:
|
||
|
||
- **使用 AuditableEntity 基类**:最常用,包含审计和软删除
|
||
- **使用 Entity 基类**:只需要 Id,不需要审计
|
||
- **完全自定义**:不使用任何基类,完全自主
|
||
- **实现接口但不用基类**:灵活控制+享受功能
|
||
- **只实现软删除接口**:只要软删除,不要审计
|
||
- **包含值对象**:复杂实体结构
|
||
|
||
### 2. 快速开始(01_BasicUsageTests.cs)
|
||
|
||
演示最简单的 3 行代码启动方式:
|
||
|
||
```csharp
|
||
var builder = new DataContextBuilder<TestDbContext>();
|
||
builder.UseInMemoryDatabase("MyDb");
|
||
var db = builder.Build();
|
||
```
|
||
|
||
### 3. 完整 CRUD(02_RepositoryCRUDTests.cs)
|
||
|
||
演示所有基础操作:
|
||
|
||
- 添加单个/批量实体
|
||
- 各种查询方式(ID、条件、First、分页等)
|
||
- 更新实体
|
||
- 删除实体(物理/逻辑)
|
||
- 统计查询(Count、Any)
|
||
- 复杂 LINQ 查询
|
||
|
||
### 4. 审计追踪(03_AuditFeatureTests.cs)
|
||
|
||
演示自动审计功能:
|
||
|
||
- 创建时自动记录 CreatedAt/CreatedBy
|
||
- 更新时自动记录 UpdatedAt/UpdatedBy
|
||
- 多次更新的审计历史
|
||
- 动态获取当前用户(注:当前版本需为每个操作创建新的 DataContext)
|
||
|
||
### 5. 软删除(04_SoftDeleteTests.cs)
|
||
|
||
演示软删除与物理删除的区别:
|
||
|
||
- 软删除不会真正删除数据
|
||
- 查询时自动过滤已删除数据
|
||
- 使用 IgnoreQueryFilters 查询已删除数据
|
||
- 软删除 vs 物理删除的应用场景
|
||
|
||
### 6. 分页查询(05_PaginationTests.cs)
|
||
|
||
演示各种分页场景:
|
||
|
||
- 基础分页
|
||
- 带条件的分页
|
||
- 带排序的分页
|
||
- 遍历所有页
|
||
- 分页结果的使用(PageIndex、TotalCount、TotalPages 等)
|
||
|
||
### 7. 自定义实体(06_CustomEntityTests.cs)
|
||
|
||
演示完全不使用基类的灵活性:
|
||
|
||
- 完全自定义的实体
|
||
- 字符串主键
|
||
- 自增 Int 主键
|
||
- 包含值对象的实体
|
||
- 混合使用不同类型的实体
|
||
|
||
### 8. EF Core 直接使用(07_EFCoreDirectUsageTests.cs)
|
||
|
||
演示如何在需要时降级使用 EF Core:
|
||
|
||
- 访问底层 DbContext
|
||
- 直接使用 DbSet
|
||
- 执行原生 SQL
|
||
- 事务管理
|
||
- 批量操作优化
|
||
- AsNoTracking 性能优化
|
||
- 实体变更跟踪
|
||
- 高级查询
|
||
|
||
## 注意事项
|
||
|
||
### PagedResult 属性名称
|
||
|
||
`PagedResult<T>` 来自 `Common.ExpandFun` 命名空间,使用的属性名是:
|
||
|
||
- `PageIndex` (而不是 Page)
|
||
- `PageSize`
|
||
- `TotalCount`
|
||
- `TotalPages`
|
||
|
||
### 动态修改当前用户
|
||
|
||
当前版本的 DataContext 不支持动态修改当前用户。如果需要模拟不同用户操作,请为每个用户创建新的 DataContext 实例:
|
||
|
||
```csharp
|
||
// 用户 A 的操作
|
||
using (var dbA = CreateDataContext("userA"))
|
||
{
|
||
// ... 操作
|
||
}
|
||
|
||
// 用户 B 的操作
|
||
using (var dbB = CreateDataContext("userB"))
|
||
{
|
||
// ... 操作
|
||
}
|
||
```
|
||
|
||
### InMemory 数据库限制
|
||
|
||
测试使用 InMemory 数据库,它有一些限制:
|
||
|
||
- 不支持原生 SQL 查询(FromSqlRaw/ExecuteSqlRaw)
|
||
- 不完全模拟关系数据库的所有行为
|
||
- 主要用于快速测试
|
||
|
||
实际项目应该使用真实数据库(SQLite、SQL Server 等)。
|
||
|
||
## 学习路径建议
|
||
|
||
1. **入门**:先看 `01_BasicUsageTests.cs`,了解如何快速开始
|
||
2. **基础**:学习 `02_RepositoryCRUDTests.cs`,掌握基础 CRUD 操作
|
||
3. **进阶**:了解审计(03)、软删除(04)、分页(05)功能
|
||
4. **高级**:学习自定义实体(06)和 EF Core 直接使用(07)
|
||
|
||
## 最佳实践
|
||
|
||
1. **根据需求选择实体定义方式**
|
||
- 需要审计+软删除:使用 `AuditableEntity`
|
||
- 只需要基础 CRUD:使用 `Entity` 或完全自定义
|
||
- 已有实体模型:保持原样,直接使用
|
||
|
||
2. **性能优化**
|
||
- 只读查询使用 `AsNoTracking()`
|
||
- 批量操作使用 `AddRange/UpdateRange/RemoveRange`
|
||
- 避免在循环中调用 `SaveChangesAsync`
|
||
|
||
3. **灵活使用**
|
||
- 简单场景用仓储
|
||
- 复杂查询直接用 EF Core
|
||
- 两者可以无缝混用
|
||
|
||
## 问题反馈
|
||
|
||
如有问题或建议,请参考 Data 模块的 README.md 文件。
|