一.概述

  目前对于.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. svg查看预览 , 鼠标控制放大缩小 , 托拉拽等

    自己写是不可能了 , 所以要借用插件 svg-panzoom.js 地址 : https://github.com/ariutta/svg-pan-zoom#demos 及常见问题https://ww ...

  2. 清晰明亮的白色lua协程(coroutine)

    协同程序线程类和多线程下似:它有它自己的堆栈.自己的局部变量.它有自己的指令指针,但是,其他协程共享全局变量和其他项目信息.主要不同在于:多处理器的情况下.概念上来说多线程是同一时候执行多个线程,而协 ...

  3. Uniform synchronization between multiple kernels running on single computer systems

    The present invention allocates resources in a multi-operating system computing system, thereby avoi ...

  4. Clojure实现的简单短网址服务(Compojure、Ring、Korma库演示样例)

    用clojure写了一个简单的短网址服务(一半抄自<Clojure 编程>).在那基础上增加了数据库,来持久化数据. 功能 用Get方法缩短一个网址: 然后在短网址列表就能够查看了, 接下 ...

  5. 《The Economist》的阅读

    cover story(封面故事): Clean energy's dirty secret:清洁能源的肮脏幕后: 0. 词汇 respite:n. 缓解:暂缓:暂时的休息:缓期执行:也作及物动词(v ...

  6. Tinyhttpd - 超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client(Qt也有很多第三方HTTP类)

    - 2. Tinyhttpd tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Htt ...

  7. c# 守护进程,WPF程序自守护

    原文:c# 守护进程,WPF程序自守护 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/79035246 如何 ...

  8. AngularJS 页面计算

    <div ng-app="multipliedCaculateApp" ng-controller="multipliedCaculateController as ...

  9. XF内容视图和框架

    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...

  10. 枚举与字符串转及RecordSet转XML,JSON

    function AdoToJs(ado: TADOQuery): string; var I, J: Integer; json: string; begin json := '{columns:[ ...