背景

17年开始,公司开始向DotNet Core转型,面对ORM工具的选型,当时围绕Dapper和EF发生了激烈的讨论。项目团队更加关注快速交付,他们主张使用EF这种能快速开发的ORM工具;而在线业务团队对性能有更高的要求,他们更希望使用能直接执行Sql语句的Dapper,这样可控性更高。而对于架构团队来说,满足开发团队的各种需求,提高他们的开发效率是最核心的价值所在,所以当时决定做一个混合型的既支持EF又支持dapper的数据仓储。

为什么选择EF+Dapper

目前来说EF和Dapper是.NET平台最主流的ORM工具,团队成员的接受程度很高,相关的资料非常齐全,学习成本很低,各种坑也最少。

介绍

  1. 它不是一个ORM工具,它不做任何关于数据底层的操作

  2. 它是一个简易封装的数据库仓储和工作单元模型

  3. 能帮助你快速的构建项目的数据访问层

  4. 经过了2年多时间,10个项目组,大小近100多个线上项目的考验

  5. 支持EF和Dapper,可以在项目中随意切换使用

  6. 支持工作单元模式,也支持传统事务

  7. 支持Mysql和Mssql

  8. 支持同步和异步操作,推荐使用异步

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的混合仓储,助你快速搭建数据访问层相关推荐

  1. 8个小程序开源项目助你快速搭建小程序

    今天和大家分享几个小程序开源项目, 帮助我们轻松搭建自己的小程序应用. 我会从大家最熟悉的小程序UI组件, 到可视化库, 再到完整项目, 一一和大家介绍. 小程序UI组件库 小程序多端开发框架 小程序 ...

  2. 一款开源、免费的微信管家系统,助你快速搭建微信应用

    JeewxBoot是一款免费的JAVA微信管家平台,支持微信公众号.小程序.微信第三方平台.抽奖活动等.JeewxBoot已经实现了系统权限管理.公众号管理.抽奖活动等基础功能,便于二次开发,可以快速 ...

  3. dapper 使用sqlbulkcopy,50秒插入百万数据

    在netcore中常常使用的EF,Dapper等orm框架,在做批量数据插入的时候,一般都是两种操作: 1:逐行插入,insert into.... 2:批量插入. 最近项目中遇到个问题,需要同时插入 ...

  4. mysql .net core_MySQL官方.NET Core驱动已出,支持EF Core

    千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...

  5. 通过EF/Dapper扩展实现数据库审计功能

    相信大家都有过周末被电话"吵醒"的经历,这个时候,客服同事会火急火燎地告诉你,客户反馈生产环境上某某数据"异常",然后你花费大量时间去排查这些错误数据,发现这是 ...

  6. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类 ...

  7. ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用

    <ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用>是一本旨在引领我们进入全栈开发世界的综合指南.通过结合强大的ChatGPT技术和全栈开发的实践,我们将 ...

  8. 互融云供应链集采管理平台:助企业快速打造供应链金融生态圈

    集采即集中采购,是指将集中采购目录内的货物.工程.服务集中进行采购.集采有助于集中管理和批量采购,从而带来更好的价格和条款,以及提升与大型供应商合作的能力.集采融资可缓解中小微企业资金不足.融资难.融 ...

  9. WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧

    2019独角兽企业重金招聘Python工程师标准>>> 下载WijmoJS 2019 v1 WijmoJS是为企业应用程序开发而推出的一系列包含HTML5和JavaScript的开发 ...

最新文章

  1. react 组件连动效果_react-redux应用之独立组件联动实例
  2. spyder上怎样将figure框出来_怎样将数据中心现有的物理机和虚拟机平滑的迁移到云平台上?...
  3. 解决hao123胁持chrome等浏览器主页问题
  4. 十年磨一剑!SACC带你领略企业大数据平台实践优化!
  5. 解决LoggerFactory is not a Logback LoggerEither remove Logback or the competing implementation (class
  6. selenium3 + python - cookie定位
  7. 漫画面向对象编程,用漫画给你讲技术!
  8. thinkphp5.0连接mysql_thinkphp5.0数据库操作
  9. Windows Server定时执行bat
  10. mysql新建数据库数据类型_数据库Mysql的学习(二)-数据类型和创建
  11. 零基础学习 自动化编程- 第一天 计算机语言
  12. 企业服务总线ESB是什么
  13. MPMLink 中 通过 零件号+MBOM版本,查询正确的EBOM版本(相当于对等部件功能)
  14. 国外lead,广告联盟常见的任务类型和操作方法
  15. C | 使用C语言读取.mat文件
  16. iOS 如何实现 AppStore 中App 的自动下载
  17. 小萝莉说Crash(二): Unrecognized selector xxx 之 ForwardInvocation
  18. 诸神之眼-nmap详细使用介绍1!基础使用与主机发现篇! (*╹▽╹*) 信息收集 ~ 其二
  19. 娱乐,舰娘r建造公式【转】
  20. windows下 python 使用 pip 安装TA-Lib报错的原因及解决方法

热门文章

  1. 如何在Microsoft Excel中将文本转换为日期值
  2. React 深入学习:React 更新队列
  3. 深入MySQL存储引擎分析锁和排序的原理
  4. 结合hello world探讨gcc编译程序的过程
  5. delphi中利用Indy的TIdFtp控件实现FTP协议
  6. #HTTP协议学习# (七)cookie
  7. C 语言中的内存分析
  8. 鸟哥学习笔记---网络驱动器设备iSCSI
  9. TTL expired in transit--问题篇~
  10. Blazor University (5)组件 — 字面量、表达式和指令