网站首页 > 文章精选 正文
我是编程乐趣,一个10年.Net开发经验老程序员,点击右上方“关注”,每天为你分享开源项目和编程知识。私信回复:888,领取.Net学习资料!
针对一些大型项目、高并发的场景的项目,我们往往需要多数据库、分表的方式,才能支撑项目的运行。
今天推荐一个开源项目,让我们轻松实现,多数据库、分表的项目开发。
01
项目简介
UnitOfWork,它是一个基于
Microsoft.EntityFrameworkCore 的插件,目标是简化复杂数据库操作,同时支持以下核心功能:
- 仓储模式(Repository Pattern)
提供统一的接口,方便对数据库操作进行抽象和封装。 - 单元工作模式(Unit of Work Pattern)
管理多个仓储的事务,确保一组操作要么全部成功,要么全部失败,从而保证数据一致性。 - 多数据库支持
支持跨多个数据库的操作,适用于复杂的分布式系统。 - 分布式事务支持
在多数据库环境中,确保事务的提交或回滚是全局一致的。 - MySQL 分库分表支持
动态切换数据库或表,支持 MySQL 的分库分表功能,适用于大规模数据的分布式存储。
02
项目特点
- 动态切换数据库和表:通过 ChangeDatabase 和 ChangeTable 方法,可以灵活地在运行时切换数据库或表。
- 简化事务管理:通过 UnitOfWork,可以轻松管理事务,确保数据一致性。
- 支持多种数据库操作:包括插入、查询、更新、分页等常用功能。
- 扩展性强:支持自定义仓储和扩展方法,满足复杂业务需求。
03
使用方法
1、项目配置
// 注册 DbContext
services
// 添加 QuickStartContext 数据上下文
.AddDbContext<QuickStartContext>(opt =>
// 配置使用内存数据库(适用于测试环境)
opt.UseInMemoryDatabase()
)
// 添加 UnitOfWork 支持
.AddUnitOfWork<QuickStartContext>()
// 添加自定义仓储
// 指定 Blog 实体对应的仓储为 CustomBlogRepository
.AddCustomRepository<Blog, CustomBlogRepository>();
2、单元模式使用、切换数据库
// 定义一个只读的 IUnitOfWork 字段
private readonly IUnitOfWork _unitOfWork;
// 控制器构造函数,注入 IUnitOfWork
public ValuesController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork; // 将注入的 IUnitOfWork 赋值给字段
// 动态切换数据库,目前仅支持 MySQL
// 根据当前年份动态切换数据库,例如 "uow_db_2025"
_unitOfWork.ChangeDatabase(#34;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(#34;user_{ym}");
postRepo.ChangeTable(#34;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(); // 提交更改
}
04
项目地址
https://github.com/arch/UnitOfWork
- End -
私信回复:888,领取.Net学习资料!
更多.Net开源项目合集(已整理300个):
https://github.com/bianchenglequ/NetCodeTop
猜你喜欢
- 2025-06-09 技术老兵十年专攻MySQL:编写了763页核心总结,90%MySQL问题全解
- 2025-06-09 从B+树原理到实战:MySQL索引设计的22条军规
- 2025-06-09 mysqldump备份操作大全及相关参数详解
- 2025-06-09 在Windows 10下安装配置MySQL数据库
- 2025-06-09 MySQL 批量写入性能暴增 10 倍!资深工程师的 7 个狠招(附实战代码)
- 2025-06-09 从零到亿级数据:MySQL 分库分表实战避坑指南
- 2025-06-09 重磅发布!这份MySQL全面总结手册,受喜爱程度不输任何大厂笔记
- 2025-06-09 MySql客户端(MySQL客户端安装教程)
- 2025-06-09 掌握Pymysql轻松实现Python数据库编程
- 2025-06-09 Linux:从命令行备份 MySQL 数据库
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 计算机网络的拓扑结构是指() (45)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)