17年开始,公司开始向DotNet Core转型,面对ORM工具的选型,当时围绕Dapper和EF发生了激烈的讨论。项目团队更加关注快速交付,他们主张使用EF这种能快速开发的ORM工具;而在线业务团队对性能有更高的要求,他们更但愿使用能直接执行Sql语句的Dapper,这样可控性更高。而对于架构团队来讲,知足开发团队的各类需求,提升他们的开发效率是最核心的价值所在,因此当时决定作一个混合型的既支持EF又支持dapper的数据仓储。html
目前来讲EF和Dapper是.NET平台最主流的ORM工具,团队成员的接受程度很高,相关的资料很是齐全,学习成本很低,各类坑也最少。git
PS: 简单操做使用EF,复杂sql操做使用Dapper是快速开发的秘诀。github
引入nugetsql
<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,若是你不须要操做上下文能够不用作这一步app
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") );
若是你没有建立上下文ide
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);
编辑
//编辑,支持批量编辑 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);
删除
//删除,支持批量删除 _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的功能均可以使用。好比导航属性,字段映射等等。这个库是线上项目核心依赖,会长期更新维护,但愿你们能提出更好的意见。
QQ群:687800650 有问题能够加群交流
数据库脚本在根目录的sqlscript文件夹里面
github地址
原文出处:https://www.cnblogs.com/longxianghui/p/11635928.html