Files
sharp-basic/test/Data.Test

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)
  • PageSize
  • TotalCount
  • TotalPages

动态修改当前用户

当前版本的 DataContext 不支持动态修改当前用户。如果需要模拟不同用户操作,请为每个用户创建新的 DataContext 实例:

// 用户 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 文件。