[LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式
目录
- [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询
- [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询
- [LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射
- [LINQ2Dapper]最完整Dapper To Linq框架(四)---Linq和SQL并行使用
- [LINQ2Dapper]最完整Dapper To Linq框架(五)---查看Linq实际执行的SQL
- [LINQ2Dapper]最完整Dapper To Linq框架(六)---多表联合与匿名类型返回
- [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式
- [LINQ2Dapper]最完整Dapper To Linq框架(八)---导航属性
3.1.8版本增加新功能仓储模式
Kogel.Repository 作为扩展,现实了通用仓储层功能。与其他规范标准一样,仓储层也有相应的规范定义
1.安装
使用仓储模式需要安装扩展包Kogel.Repository,可在Nuget上搜索最新版本
或者使用Nuget命令
dotnet add package Kogel.Repository
2.定义
public class TestRepository : BaseRepository<Comment>//Comment为实体类 { public override void OnConfiguring(RepositoryOptionsBuilder builder) { builder .BuildConnection(x=> new MySqlConnection("Server=localhost;Database=Qx_Sport_Common;Uid=root;Pwd=123456;")) .BuildConnection(x=> new MySqlConnection("Server=localhost;Database=Qx_Sport_Common_2;Uid=root;Pwd=123456;"),"Qx_Sport_Common_2")//配置连接方式(可以配置多数据库) .BuildProvider(new MySqlProvider());//配置数据库提供者 } }
用此方法可以根据自身需求配置多数据库 (内部自带连接池)
在.net core中有更加简便的注入方式
//动态注入实体到仓储 services.AddKogelRepository((kogel) => { kogel.BuildConnection(x => new MySqlConnection(@"数据库连接字符串")); kogel.BuildProvider(new MySqlProvider()); });
使用
IRepository<FlowOrder> repository; public ValuesController(IRepository<FlowOrder> repository) { this.repository = repository; } // GET api/values [HttpGet] public ActionResult<object> Get() { return repository.FindById(4); }
或者使用函数注册连接方式
//全局只需注册一次 RepositoryOptionsBuilder.RegisterDataBase(x=>new MySqlConnection("Server=localhost;Database=Qx_Sport_Common;Uid=root;Pwd=123456;") ,"连接别名");
3.使用方法
1.支持原生Kogel.Dapper.Extension的方法
using (TestRepository testRepository = new TestRepository()) { var querySet = testRepository.QuerySet();//查询对象 var commandSet = testRepository.CommandSet();//执行对象 }
或者使用事务中的Orm属性
using (TestRepository testRepository = new TestRepository()) { var comment = testRepository.Orm.QuerySet<Comment>().ToList(); }
此Orm属性相当于仓储使用的IDbConnection
还支持基础的增删改查
/// <summary> /// 根据主键获取当前实体数据 /// </summary> /// <returns></returns> T FindById(int id); /// <summary> /// 增加 /// </summary> /// <returns></returns> int Insert(T entity); /// <summary> /// 删除(根据主键) /// </summary> /// <returns></returns> int Delete(int id); /// <summary> /// 修改(根据主键) /// </summary> /// <returns></returns> int Update(T entity);
还可以使用自定义仓储对象
//自定义仓储释放时 conn也会释放 using (var divReposirory = conn.QuerySet<FlowOrder>().GetRepository()) { //使用自定义仓储查询 var flowOrder = divReposirory.FindById(1); }
使用仓储时如果配置了多数据库可以通过ChangeDataBase切换数据库(只在当前仓储中生效)
例如
using (var repository = new TestRepository()) { var data = repository.QuerySet() .Where(x => x.DeliveredTime.HasValue && x.CustomerCode == "test") .Get(); //切换数据库 repository.ChangeDataBase("Qx_Sport_Common_2"); var dataList = repository.QuerySet() .Where(x => x.DeliveredTime.HasValue && x.CustomerCode.StartsWith("test")) .Top(10) .ToList(); //第一个配置的连接,如果没有设置别名就为master repository.ChangeDataBase("master"); dataList = repository.QuerySet() .Where(x => x.DeliveredTime.HasValue && x.CustomerCode == "test") .Top(10) .ToList(); }
2.UnitOfWork
UnitOfWork 可将多个数据库操作放在一个单元管理执行,最终通用 Commit 执行所有操作,内部采用了数据库事务;
例如
using (TestRepository testRepository = new TestRepository()) { //开始事务 testRepository.UnitOfWork.BeginTransaction(() => { var comment = testRepository.Orm.QuerySet<Comment>().ToList(); testRepository.Orm.CommandSet<Comment>() .Where(x => x.Id == comment.FirstOrDefault().Id) .Update(comment.FirstOrDefault()); //其他仓储类代码块 new TestRepositoryQuery1().Test(); }); //提交 testRepository.UnitOfWork.Commit(); }
其他仓储类的代码块也会进入此单元管理的事务中,因为他们都将会用指定方(testRepository)开启的IDbConnection与IDbTransaction并且如果事务
中的代码块异常,会第一时间回滚并且抛出异常
如果工作单元事务中存在其他数据库连接方式(根据连接字符串判断)的查询编辑语句,则会使用自身的连接和事务不会用指定方(testRepository)开启
的IDbConnection与IDbTransaction
框架开源,完整框架源码可以去Github上下载:
https://github.com/a935368322/Kogel.Dapper.Extension
如有问题也可以加QQ群讨论:
技术群 710217654