一.概述

  目前对于.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. CUDA软件架构—网格(Grid)、线程块(Block)和线程(Thread)的组织关系以及线程索引的计算公式

    网格(Grid).线程块(Block)和线程(Thread)的组织关系 CUDA的软件架构由网格(Grid).线程块(Block)和线程(Thread)组成,相当于把GPU上的计算单元分为若干(2~3 ...

  2. Matlab Tricks(十五) —— 圆的正确画法

    使用参数方程, phi = 0:0.01:2*pi; x = cos(phi); y = sin(phi); axis equal plot(x, y) 根据参数方程,显然,圆心在 (0, 0),半径 ...

  3. CCD 与 CMOS

    窗帘快门与全局快门: 窗帘快门,每次只允许一条缝的光线摄入,因此会呈现自上而下的扫描式拍摄,也就意味着画面上的不同高度,其实拍摄的时间是不同的,也就进一步造成了在高速移动的火车上,如果拍摄窗外的景物, ...

  4. Java文件运用

    1.使用java修改文件内容: package fileopt; import java.io.BufferedReader; import java.io.BufferedWriter; impor ...

  5. 使用CMD实现批量重命名[转]

    关键字:cmd DOS 批处理 批量 重命名 作者:lifesinger地址:http://www.cnblogs.com/txw1958/archive/2012/12/24/cmd-batch-r ...

  6. 简明Python3教程 8.控制流

    简介 迄今为止我们见到的所有程序总是含有一连串语句并且python忠实的顺序执行它们. 那么如何改变它们的执行顺序呢?例如你希望程序根据不同情况作出不同反应,按照当前时间分别 打印出’Good Mor ...

  7. WPF 中的三维文字[转贴]

    原文:WPF 中的三维文字[转贴] 原文: http://msdn.microsoft.com/msdnmag/issues/07/10/Foundations/default.aspx?loc=zh ...

  8. Python小技巧1

    原文: http://blog.csdn.net/jclass/article/details/6144647 一. 打印并输出到文件 >>> print("aa" ...

  9. python 教程 第十章、 输入/输出

    第十章. 输入/输出 1)    文件 poem = '''Programming is fun use Python!''' f = file('poem.txt', 'w') # open for ...

  10. C++该typeid和dynamic_cast

    1.typeid在没有虚拟函数的(不相关的动态绑定),typeid它只返回操作对象的实际类型 2.typeid涉及到动态联编问题时(使用基类指针p或者引用p操作派生类对象),typeid(p)返回基类 ...