A:增加数据库配置和使用

This commit is contained in:
jimmy committed 2025-11-18 11:14:56 +08:00
1 parent 53d1dd2dbf
commit f7660c49e8
86 files changed
+7401 -271

No files matched your search

+184
View File
@@ -0,0 +1,184 @@
# 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 文件。