HTML5技术

DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的ORM框架 - Frank.Cui

字号+ 作者:H5之家 来源:H5之家 2017-03-18 14:07 我要评论( )

为什么要重复造轮子 因为现有的轮子都在某些方面不太令我满意,下面我来一一点评一下,欢迎拍砖。 Entity Framework 我喜欢傻瓜化使用方式的框架,同时又不失灵活性。 EF虽然使用起来足够简单,但却不够灵活。例如,在EF Core中你无法用原生SQL写一个多表连接

为什么要重复造轮子

因为现有的轮子都在某些方面不太令我满意,下面我来一一点评一下,欢迎拍砖。

Entity Framework

我喜欢傻瓜化使用方式的框架,同时又不失灵活性。

EF虽然使用起来足够简单,但却不够灵活。例如,在EF Core中你无法用原生SQL写一个多表连接查询(返回的结果是多表连接的结果)

单表简单条件查询还好,多表查询时生成的SQL性能实在不敢恭维,我更喜欢自己写SQL,可控性更高,心里有底

EF的设计不利于项目的分层;我理想的设计是隔离、低耦合,和数据库打交道的事就交给Db层好了,所有数据库的特性都隔离在Db层内部,对外按业务提供傻瓜化的接口。
而使用EF你没法做到真正的隔离

Dapper

我喜欢它的轻量级,高性能。但它"只支持"原生SQL读写数据库,使用起来还是不太方便。

很多常用的情景其实可以封装一下不用写SQL的,像EF一样,直接Add一个Entity

虽然现在Dapper已经有了这样一个封装,但目前来看实在过于粗糙

PetaPoco

它可以像EF一样直接Add一个Entity,也可以像Dapper一样自己写原生SQL,按理说这已经很完美了。

但是,它不支持批量插入、更新啊

DapperPoco

在实在找不到满意框架的情况下,于是DapperPoco就诞生了,它是基于Dapper高度封装的,有Dapper的一切优点,同时也弥补了它的不足,它有如下特点:

现已将其开源并放到了github上,地址为:https://github.com/md-frank/DapperPoco

如何使用 首先定义一个Poco类

Article { public long Id { get; set; } public string Title { get; set; } public string Content { get; set; } }

创建DbContext

class MasterDbContext : DbContext { OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseConnectionString(); //使用SQL Server数据库 optionsBuilder.UseSqlAdapter(new SqlServerAdapter(SqlClientFactory.Instance)); } OnEntitiesBuilding(EntitiesBuilder entityBuilder) { //属性名与表列名(列名)不一样,可在此映射别名 entityBuilder.Entity<Article>() .TableName() .ColumnName(p => p.Id, ); } }

插入数据

var masterDb = new MasterDbContext(); a = new Article { Title = , Content = }; masterDb.Insert(a); //插入了2条记录 masterDb.Insert(new Article[] { a, a }); //也可以显式指定表名 masterDb.Insert(a, ); .Execute(, a); .Execute(, a, a); .Execute(, new Article[] { a, a }); .Execute(, , );

更新数据

var masterDb = new MasterDbContext(); article = masterDb.FirstOrDefault<Article>(, 1); //更新除主键外的所有列 article.Title = ; article.Content = ; masterDb.Update(article); //仅更新指定列,指定表列名 article.Title = ; masterDb.Update(article, }); //仅更新指定列,指定实体属性名 article.Title = ; article.Content = ; masterDb.Update(article, null, null, p=> p.Title, p=> p.Content);

保存数据

var masterDb = new MasterDbContext(); var article = new Article { Id = 1, Title = , Content = }; //如果记录存在则更新,不存在则插入 masterDb.Save(article); //保存并指定列名 masterDb.Save(article, });

删除数据

var masterDb = new MasterDbContext(); , 1); //删除实体记录 masterDb.Delete(article); //删除实体记录,显式指定主键名 masterDb.Delete(article, );

查询数据(立即执行)

var masterDb = new MasterDbContext(); articles = masterDb.FetchAll<Article>(); articles = masterDb.Fetch<Article>(, , ); articles = masterDb.Fetch<Article>(, new [] { 1, 2, 3 }); //查询单条记录 masterDb.FirstOrDefault<Article>(, 1); count = masterDb.ExecuteScalar<); //查询分页的结果(第1页,每页20条) Paged<Article> paged = masterDb.Paged<Article>(, ); Paged<T> where T : new() { CurrentPage { get; set; } TotalPages { get; set; } TotalItems { get; set; } ItemsPerPage { get; set; } List<T> Items { get; set; } }

查询数据(延迟执行)

延迟查询使用Query,与Fetch不同的是Query返回的结果只有在使用时才会真正查询数据库

var masterDb = new MasterDbContext(); articles = masterDb.Query<Article>(, );

动态查询条件

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 基于 socket.io, 简单实现多平台类似你猜我画 socket 数据传输 - HOWIE-CH

    基于 socket.io, 简单实现多平台类似你猜我画 socket 数据传输 - HO

    2017-03-09 17:00

  • 用DapperExtensions和反射来实现一个通用搜索 - yt1983

    用DapperExtensions和反射来实现一个通用搜索 - yt1983

    2017-03-09 08:00

  • SuperWebClient -一个基于CURL的.NET HTTP/HTTPS模拟神组件(1) - ByteWorke

    SuperWebClient -一个基于CURL的.NET HTTP/HTTPS模拟神组件(1) - B

    2017-02-28 12:01

  • 基于canvas的二维码邀请函生成插件 - ppk2

    基于canvas的二维码邀请函生成插件 - ppk2

    2017-02-16 12:00

网友点评
<