Files
sharp-basic/test/Data.Test/README.md
T
2025-12-30 09:17:25 +08:00

185 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 文件。