5.5 KiB
5.5 KiB
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、事务、高级查询 |
运行测试
# 运行所有测试
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 行代码启动方式:
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)PageSizeTotalCountTotalPages
动态修改当前用户
当前版本的 DataContext 不支持动态修改当前用户。如果需要模拟不同用户操作,请为每个用户创建新的 DataContext 实例:
// 用户 A 的操作
using (var dbA = CreateDataContext("userA"))
{
// ... 操作
}
// 用户 B 的操作
using (var dbB = CreateDataContext("userB"))
{
// ... 操作
}
InMemory 数据库限制
测试使用 InMemory 数据库,它有一些限制:
- 不支持原生 SQL 查询(FromSqlRaw/ExecuteSqlRaw)
- 不完全模拟关系数据库的所有行为
- 主要用于快速测试
实际项目应该使用真实数据库(SQLite、SQL Server 等)。
学习路径建议
- 入门:先看
01_BasicUsageTests.cs,了解如何快速开始 - 基础:学习
02_RepositoryCRUDTests.cs,掌握基础 CRUD 操作 - 进阶:了解审计(03)、软删除(04)、分页(05)功能
- 高级:学习自定义实体(06)和 EF Core 直接使用(07)
最佳实践
-
根据需求选择实体定义方式
- 需要审计+软删除:使用
AuditableEntity - 只需要基础 CRUD:使用
Entity或完全自定义 - 已有实体模型:保持原样,直接使用
- 需要审计+软删除:使用
-
性能优化
- 只读查询使用
AsNoTracking() - 批量操作使用
AddRange/UpdateRange/RemoveRange - 避免在循环中调用
SaveChangesAsync
- 只读查询使用
-
灵活使用
- 简单场景用仓储
- 复杂查询直接用 EF Core
- 两者可以无缝混用
问题反馈
如有问题或建议,请参考 Data 模块的 README.md 文件。