# 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(); 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` 来自 `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 文件。