同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层
背景
17年开始,公司开始向DotNet Core转型,面对ORM工具的选型,当时围绕Dapper和EF发生了激烈的讨论。项目团队更加关注快速交付,他们主张使用EF这种能快速开发的ORM工具;而在线业务团队对性能有更高的要求,他们更希望使用能直接执行Sql语句的Dapper,这样可控性更高。而对于架构团队来说,满足开发团队的各种需求,提高他们的开发效率是最核心的价值所在,所以当时决定做一个混合型的既支持EF又支持dapper的数据仓储。
为什么选择EF+Dapper
目前来说EF和Dapper是.NET平台最主流的ORM工具,团队成员的接受程度很高,相关的资料非常齐全,学习成本很低,各种坑也最少。
介绍
它不是一个ORM工具,它不做任何关于数据底层的操作
它是一个简易封装的数据库仓储和工作单元模型
能帮助你快速的构建项目的数据访问层
经过了2年多时间,10个项目组,大小近100多个线上项目的考验
支持EF和Dapper,可以在项目中随意切换使用
支持工作单元模式,也支持传统事务
支持Mysql和Mssql
支持同步和异步操作,推荐使用异步
PS: 简单操作使用EF,复杂sql操作使用Dapper是快速开发的秘诀。
使用方法
引入nuget
<PackageReference Include="Leo.Chimp" Version="2.1.1" />
创建实体对象,继承IEntity
public class School : IEntity
{public Guid Id { get; set; }public string Name { get; set; }
}
创建仓储接口和实现类,分别继承IRepository和EfCoreRepository
public interface ISchoolRepository : IRepository<School>
{
}
public class SchoolRepository: EfCoreRepository<School>,ISchoolRepository
{public SchoolRepository(DbContext context) : base(context){}
}
创建上下文,继承BaseDbContext,如果你不需要操作上下文可以不用做这一步
public class ChimpDbContext : BaseDbContext
{public ChimpDbContext(DbContextOptions options) : base(options){}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//your code}
}
注入服务
services.AddChimp<ChimpDbContext>(opt =>opt.UseSqlServer("Server=10.0.0.99;Database=chimp;Uid=sa;Pwd=Fuluerp123")
);
如果你没有创建上下文
services.AddChimp(opt =>opt.UseSqlServer("Server=10.0.0.99;Database=chimp;Uid=sa;Pwd=Fuluerp123")
);
在Controller中使用
public class ValuesController : ControllerBase
{private readonly ISchoolRepository _schoolRepository;private readonly IUnitOfWork _unitOfWork;public ValuesController(ISchoolRepository schoolRepository, IUnitOfWork unitOfWork){_schoolRepository = schoolRepository;_unitOfWork = unitOfWork;}
}
详细使用说明
查询
//根据主键查询
_schoolRepository.GetById(Id)
//不带追踪的查询,返回数据不能用于更新或删除操作,性能快
schoolRepository.TableNoTracking.First(x => x.Id == Id);
//带追踪的查询,返回数据可以用于更新或删除操作,性能稍慢
schoolRepository.Table.First(x => x.Id == Id);
//分页查询
_schoolRepository.TableNoTracking.ToPagedList(1,10);
//sql语句查询
_unitOfWork.QueryAsync<School>("select * from school");
//sql分页查询
_unitOfWork.QueryPagedListAsync<School>(1, 10, "select * from school order by id");
关于查询,暴露了返回IQueryable的TableNoTracking、Table这两个属性,让开发人员自己组装Lambda表达式进行查询操作
新增
//新增,支持批量新增
_schoolRepository.Insert(school);
await _unitOfWork.SaveChangesAsync();
//sql语句新增
await _unitOfWork.ExecuteAsync("insert school(id,name) values(@Id,@Name)",school);
await _unitOfWork.SaveChangesAsync();
编辑
//编辑,支持批量编辑
var school = await _schoolRepository.GetByIdAsync(Id);
school.Name="newschool";
_schoolRepository.Update(school);
await _unitOfWork.SaveChangesAsync();
//编辑,不用先查询
var school = new School
{Id = "xxxxxx",Name = "newschool"
};
_schoolRepository.Update(school, x => x.Name);
await _unitOfWork.SaveChangesAsync();
//sql语句编辑
await _unitOfWork.ExecuteAsync("update school set name=@Name where id=@Id",school);
await _unitOfWork.SaveChangesAsync();
删除
//删除,支持批量删除
_schoolRepository.Delete(school);
await _unitOfWork.SaveChangesAsync();
//根据lambda删除
_schoolRepository.Delete(x => x.Id == Id);
await _unitOfWork.SaveChangesAsync();
事务
//工作单元模式使用事务
await _schoolRepository.InsertAsync(school1);
await _schoolRepository.InsertAsync(school2);
await _unitOfWork.SaveChangesAsync();
//dapper使用事务
using (var tran = _unitOfWork.BeginTransaction())
{try{await _unitOfWork.ExecuteAsync("insert school(id,name) values(@Id,@Name)",school1,tran);await _unitOfWork.ExecuteAsync("insert school(id,name) values(@Id,@Name)",school2,tran);tran.Commit();}catch (Exception e){tran.Rollback();}
}
//dapper+ef混合使用事务
using (var tran = _unitOfWork.BeginTransaction())
{try{await _schoolRepository.InsertAsync(school1);await _unitOfWork.SaveChangesAsync();await _unitOfWork.ExecuteAsync("insert school(id,name) values(@Id,@Name)",school2);tran.Commit();}catch (Exception e){tran.Rollback();}
}
高级用法
//通过GetConnection可以使用更多dapper扩展的方法
await _unitOfWork.GetConnection().QueryAsync("select * from school");
写在最后
Chimp核心是基于EF和Dapper的,所以EF和Dapper的功能都可以使用。比如导航属性,字段映射等等。这个库是线上项目核心依赖,会长期更新维护,希望大家能提出更好的意见。
项目地址v
数据库脚本在根目录的sqlscript文件夹里面 :https://github.com/longxianghui/chimp.git
原文链接:https://www.cnblogs.com/longxianghui/p/11635928.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层相关推荐
- 8个小程序开源项目助你快速搭建小程序
今天和大家分享几个小程序开源项目, 帮助我们轻松搭建自己的小程序应用. 我会从大家最熟悉的小程序UI组件, 到可视化库, 再到完整项目, 一一和大家介绍. 小程序UI组件库 小程序多端开发框架 小程序 ...
- 一款开源、免费的微信管家系统,助你快速搭建微信应用
JeewxBoot是一款免费的JAVA微信管家平台,支持微信公众号.小程序.微信第三方平台.抽奖活动等.JeewxBoot已经实现了系统权限管理.公众号管理.抽奖活动等基础功能,便于二次开发,可以快速 ...
- dapper 使用sqlbulkcopy,50秒插入百万数据
在netcore中常常使用的EF,Dapper等orm框架,在做批量数据插入的时候,一般都是两种操作: 1:逐行插入,insert into.... 2:批量插入. 最近项目中遇到个问题,需要同时插入 ...
- mysql .net core_MySQL官方.NET Core驱动已出,支持EF Core
千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...
- 通过EF/Dapper扩展实现数据库审计功能
相信大家都有过周末被电话"吵醒"的经历,这个时候,客服同事会火急火燎地告诉你,客户反馈生产环境上某某数据"异常",然后你花费大量时间去排查这些错误数据,发现这是 ...
- ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类 ...
- ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用
<ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用>是一本旨在引领我们进入全栈开发世界的综合指南.通过结合强大的ChatGPT技术和全栈开发的实践,我们将 ...
- 互融云供应链集采管理平台:助企业快速打造供应链金融生态圈
集采即集中采购,是指将集中采购目录内的货物.工程.服务集中进行采购.集采有助于集中管理和批量采购,从而带来更好的价格和条款,以及提升与大型供应商合作的能力.集采融资可缓解中小微企业资金不足.融资难.融 ...
- WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧
2019独角兽企业重金招聘Python工程师标准>>> 下载WijmoJS 2019 v1 WijmoJS是为企业应用程序开发而推出的一系列包含HTML5和JavaScript的开发 ...
最新文章
- react 组件连动效果_react-redux应用之独立组件联动实例
- spyder上怎样将figure框出来_怎样将数据中心现有的物理机和虚拟机平滑的迁移到云平台上?...
- 解决hao123胁持chrome等浏览器主页问题
- 十年磨一剑!SACC带你领略企业大数据平台实践优化!
- 解决LoggerFactory is not a Logback LoggerEither remove Logback or the competing implementation (class
- selenium3 + python - cookie定位
- 漫画面向对象编程,用漫画给你讲技术!
- thinkphp5.0连接mysql_thinkphp5.0数据库操作
- Windows Server定时执行bat
- mysql新建数据库数据类型_数据库Mysql的学习(二)-数据类型和创建
- 零基础学习 自动化编程- 第一天 计算机语言
- 企业服务总线ESB是什么
- MPMLink 中 通过 零件号+MBOM版本,查询正确的EBOM版本(相当于对等部件功能)
- 国外lead,广告联盟常见的任务类型和操作方法
- C | 使用C语言读取.mat文件
- iOS 如何实现 AppStore 中App 的自动下载
- 小萝莉说Crash(二): Unrecognized selector xxx 之 ForwardInvocation
- 诸神之眼-nmap详细使用介绍1!基础使用与主机发现篇! (*╹▽╹*) 信息收集 ~ 其二
- 娱乐,舰娘r建造公式【转】
- windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法