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