一.概述

  目前对于.net的数据访问ORM工具很多,EF和EF Core是一个重量级的框架。最近在搭建新的项目架构,来学习一下轻量级的数据访问ORM工具Dapper。Dapper支持SQL Server,MySQL,Sqlite,SqlCE,Firebird等的高性能Micro-ORM(微ORM框架)。最新版本是1.60.16。

    Dapper扩展了IDbConnection接口,例如实现一个查询方法,Dapper定义的一个Query查询方法如下:

  public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)

    原生态ado.net的System.Data.SqlClient也实现了IDbConnection接口,可参考如下:

    https://docs.microsoft.com/en-us/dotnet/api/system.data.idbconnection?redirectedfrom=MSDN&view=netframework-4.8

    Dapper开源地址:https://github.com/StackExchange/Dapper

    Dapper Nuget包: https://www.nuget.org/packages/Dapper/

  Dapper的主要特征包括:

    (1)     支持强类型。如查询 Query<T>

    (2)     支持动态对象。在Dapper. Rainbow扩展包中有实现

    (3)     使用Execute执行执行T-SQL脚本块,不返回结果。

    (4)     批量执行SQL语句。

    (5)     “性能”是Dapper的一个亮点。官方列出了查询(select)与其它的ORM工具性能的对比参数。

    (6)     参数化查询

    (7)     列表支持

    (8)     字面替换

    (9)     对于查询的缓冲与无缓冲,默认行为是缓冲将数据交给了后端List,获得数据后,就释放了任何资源(减少了数据库共享锁等)。对于大量查询(比如:>100条),需要将缓冲行为关闭,避免占用太多内存,设置buffered:false的Query方法。  “注意缓冲不是缓存”。

        dapper buffer/cache

    (10)  实体中外键关系表映射。

    (11)  允许单个查询请求,查询多个表。如:select table1,select table2

    (12)  支持程序中数据库事务处理。

  Dapper注意事项:

    (1) Dapper缓存用来保存每个查询的信息,缓存在ConcurrentDictionary对象中,如果不使用参数的情况下动态生成sql字符串,则可能会遇到内存问题。

    (2) Dapper的简洁性意味着ORM附带的许多功能都被剥离了。它担心95%的情况,并为您提供大多数时间所需的工具。它并不试图解决所有问题。

二. Dapper源代码包

  2.1 Dapper.Contrib包

    Dapper.Contrib是包含许多用于CURD的辅助方法Contrib的关键组成部分是它为您的实体提供跟踪,以确定是否已进行更改。与EF一样GET出来的实现,在Update方法时,仅更新已更改的属性所需的SQL。Dapper.Contrib中的扩展方法的完整列表,可以看出方法都是强类型:

T Get<T>(id);
IEnumerable<T> GetAll<T>();
int Insert<T>(T obj);
int Insert<T>(Enumerable<T> list);
bool Update<T>(T obj);
bool Update<T>(Enumerable<T> list);
bool Delete<T>(T obj);
bool Delete<T>(Enumerable<T> list);
bool DeleteAll<T>();

    Dapper将自动使用名为“ id”(不区分大小写)的属性作为Key 属性(所以数据表中最好以ID名称为主键), 如果实体不遵循此约定,请使用[Key][ExplicitKey]属性修饰特定属性。[Key]应该用于数据库生成的键(例如自动增量列),而[ExplicitKey]应该用于代码中生成的显式键值

public class User
{
[Key]
int TheId { get; set; }
string Name { get; set; }
int Age { get; set; }
}

    Dapper.Contrib使用了一些可选属性:[Table("Tablename")] - 使用另一个表名而不是类的名称,如下示例:

[Table ("emps")]
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
} 

    [Write(true/false)] - 这个属性是(不)可写的
    [Computed] - 此属性已计算,不应作为更新的一部分

  具体参考 https://github.com/StackExchange/Dapper/tree/master/Dapper.Contrib

  2.2 Dapper.EntityFramework包

    Dapper.EntityFramework和Dapper.EntityFramework.StrongName依赖了entityframework 6.1.3 的DbGeography类和Microsoft.SqlServer.Types的SqlGeography类,  从数据库中读取几何和地理值时,我们需要明确指定SRID以将其保留在DbGeometry / DbGeography类型中。

  2.3 Dapper. Rainbow包

    Rainbow是一个Abstract类,可以将其用作Dapper类的基类,实现CURD的方法,以Dynamic为主的动态类型用于插入、更新、以及查询参数的实现,输出返回强类型。Rainbow希望你的所有表都有一个名为“Id”的标识列,在Dapper源代码解决方案下没有Dapper. Rainbow组件的测试案例。

    Contrib和Rainbow之间的主要区别在于:一个跟踪您实体的变化,另一个不跟踪:

    (1)  如果希望能够跟踪实体中的更改,请使用Contrib。

    (1)  当您想要使用更符合标准ADO.NET方法的内容时,请使用Rainbow。

  2.4 Dapper.SqlBuilder包

    Dapper.SqlBuilder组件,用于动态构建SQL查询。

  2.5  Dapper.StrongName与Dapper包

    StrongName包下的所有类文件都是来源于Dapper包中的类,支持SQL Server,MySQL,Sqlite,SqlCE,Firebird等的高性能Micro-ORM, 用于强名称,使用SqlMapper来实现ADO.NET的轻量级对象映射器。

三.其它扩展包

  3.1 Dapper. SimpleCRUD

    SimpleCRUD是一个简单CRUD助手,可以选择更改数据库方言。默认为Microsoft SQL Server,但可以更改为PostgreSQL或MySQL。放弃了.Net Core版本的SQLite支持(在新项目中实用)。

  3.2 Dapper.Extensions.NetCore

    Dapper是一个简单的CRUD助手。在Nuget上还有其它Dapper.Extensions.xx的扩展包。

asp.net core系列 66 Dapper介绍--Micro-ORM的更多相关文章

  1. asp.net core系列 39 Razor 介绍与详细示例

    原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...

  2. asp.net core系列 46 Identity介绍

    一. Identity 介绍 ASP.NET Core Identity是一个会员系统,可为ASP.NET Core应用程序添加登录功能.可以使用SQL Server数据库配置身份以存储用户名,密码和 ...

  3. asp.net core 系列 19 EFCore介绍

    一.概述 目前最新的EF Core版本是3.0,最稳定的EF Core版本是2.2.EF Core 的计划与 .NET Core以及 ASP.NET Core 版本同步.EF Core 是一个 .NE ...

  4. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  5. Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作

    ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper ...

  6. asp.net core系列 40 Web 应用MVC 介绍与详细示例

    一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...

  7. asp.net core系列 39 Web 应用Razor 介绍与详细示例

    一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...

  8. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  9. Asp.net Core 系列之--3.领域、仓储、服务简单实现

    ChuanGoing 2019-11-11  距离上篇近两个月时间,一方面时因为其他事情耽搁,另一方面也是之前准备不足,关于领域驱动有几个地方没有想通透,也就没有继续码字.目前网络包括园子里大多领域驱 ...

随机推荐

  1. [Scikit-Learn] - 数据预处理 - 缺失值(Missing Value)处理

    reference : http://www.cnblogs.com/chaosimple/p/4153158.html 关于缺失值(missing value)的处理 在sklearn的prepro ...

  2. C++ Lambda表达式基本用法(言简意赅,非常清楚)

    创建一个匿名函数并执行.Objective-C采用的是上尖号^,而C++ 11采用的是配对的方括号[].实例如下: 1 2 3 4 5 6 7 8 9 #include <iostream> ...

  3. CUDA中block和thread的合理划分配置

    CUDA并行编程的基本思路是把一个很大的任务划分成N个简单重复的操作,创建N个线程分别执行执行,每个网格(Grid)可以最多创建65535个线程块,每个线程块(Block)一般最多可以创建512个并行 ...

  4. e.target e.currenttarget

    概述 当事件穿过 DOM 时,识别事件的当前目标对象(Identifies the current target for the event, as the event traverses the D ...

  5. 【struts2+hibernate4】小型电子商务站点

    这里使用的是struts2和hibernate4两个框架开发的一个小型电子商务站点,数据库方面我也会给出对应的代码. 总之使用的是:struts2+hibernate4+jsp+MySQL+tomca ...

  6. Neo4j集群环境建设

    简介: Neo4j它是目前的主流地图数据库.它本身提供了高可用性集群解决方案.本文将试图建立一个高可用性neo4j周围环境. 1. 这是一个地图数据库? 图形库(graphic database)问题 ...

  7. Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good

    在Qt中QDialog为“窗口”,而QWidget为“部件”,首先还是了解下<Qt 窗口与部件的概念>. 对于 QDialog 的模态及非模态是直接可以实现的,很多课本中都会提到,此处总结 ...

  8. 相关web 片段记录安全性研究(不时更新)

    一.有关html/css, js, php, cgi 的一些认识 当我们浏览器訪问一个网站的静态文件.会把文件内容都下载下来(一般压缩).当然假设遇到外联的css/js,会再发起请求得 到.假设我们右 ...

  9. python实现DES加密算法和3DES加密算法

    pyDes.py ############################################################################# # Documentati ...

  10. JQuery在一个简单的表单验证的例子

    html代码例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...