针对一些大型项目、高并发的场景的项目,我们往往需要多数据库、分表的方式,才能支撑项目的运行。
今天推荐一个开源项目,让我们轻松实现,多数据库、分表的项目开发。
UnitOfWork,它是一个基于 Microsoft.EntityFrameworkCore 的插件,目标是简化复杂数据库操作,同时支持以下核心功能:
1、项目配置
// 注册 DbContext
services
// 添加 QuickStartContext 数据上下文
.AddDbContext<QuickStartContext>(opt =>
// 配置使用内存数据库(适用于测试环境)
opt.UseInMemoryDatabase()
)
// 添加 UnitOfWork 支持
.AddUnitOfWork<QuickStartContext>()
// 添加自定义仓储
// 指定 Blog 实体对应的仓储为 CustomBlogRepository
.AddCustomRepository<Blog, CustomBlogRepository>();
2、单元模式使用、切换数据库
// 定义一个只读的 IUnitOfWork 字段
privatereadonly IUnitOfWork _unitOfWork;
// 控制器构造函数,注入 IUnitOfWork
publicValuesController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork; // 将注入的 IUnitOfWork 赋值给字段
// 动态切换数据库,目前仅支持 MySQL
// 根据当前年份动态切换数据库,例如 "uow_db_2025"
_unitOfWork.ChangeDatabase($"uow_db_{DateTime.Now.Year}");
// 获取 User 和 Post 的仓储实例
var userRepo = _unitOfWork.GetRepository<User>(); // 获取 User 的仓储
var postRepo = _unitOfWork.GetRepository<Post>(); // 获取 Post 的仓储
// 根据当前年份和月份动态切换表,例如 "user_202504" 和 "post_202504"
var ym = DateTime.Now.ToString("yyyyMM");
userRepo.ChangeTable($"user_{ym}");
postRepo.ChangeTable($"post_{ym}");
// 创建一个 User 实体并插入数据库
var user = new User
{
UserName = "rigofunc", // 设置用户名
Password = "password"// 设置密码
};
userRepo.Insert(user); // 插入 User 实体
// 创建一个 Post 实体并插入数据库
var post = new Post
{
UserId = user.UserId, // 设置关联的用户 ID
Content = "What a piece of junk!"// 设置帖子内容
};
postRepo.Insert(post); // 插入 Post 实体
// 提交事务,保存所有更改到数据库
_unitOfWork.SaveChanges();
// 查询 User 实体并更新密码
var find = userRepo.Find(user.UserId); // 根据用户 ID 查询 User 实体
find.Password = "p@ssword"; // 更新密码
_unitOfWork.SaveChanges(); // 提交更改
}
https://github.com/arch/UnitOfWork