asp.net core系列 66 Dapper介绍--Micro-ORM
一.概述
目前对于.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接口,可参考如下:
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方法。 “注意缓冲不是缓存”。
(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的更多相关文章
- asp.net core系列 39 Razor 介绍与详细示例
原文:asp.net core系列 39 Razor 介绍与详细示例 一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor ...
- asp.net core系列 46 Identity介绍
一. Identity 介绍 ASP.NET Core Identity是一个会员系统,可为ASP.NET Core应用程序添加登录功能.可以使用SQL Server数据库配置身份以存储用户名,密码和 ...
- asp.net core 系列 19 EFCore介绍
一.概述 目前最新的EF Core版本是3.0,最稳定的EF Core版本是2.2.EF Core 的计划与 .NET Core以及 ASP.NET Core 版本同步.EF Core 是一个 .NE ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作
ChuanGoing 2019-09-10 距离上一篇近一个月时间,断断续续才把本篇码完,后面将加快进度,争取年度内把本系列基本介绍完成,同时督促本人持续学习. 本篇学习曲线: 1.初识Dapper ...
- asp.net core系列 40 Web 应用MVC 介绍与详细示例
一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
- asp.net core系列 39 Web 应用Razor 介绍与详细示例
一. Razor介绍 在使用ASP.NET Core Web开发时, ASP.NET Core MVC 提供了一个新特性Razor. 这样开发Web包括了MVC框架和Razor框架.对于Razor来说 ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- Asp.net Core 系列之--3.领域、仓储、服务简单实现
ChuanGoing 2019-11-11 距离上篇近两个月时间,一方面时因为其他事情耽搁,另一方面也是之前准备不足,关于领域驱动有几个地方没有想通透,也就没有继续码字.目前网络包括园子里大多领域驱 ...
随机推荐
- RabbitMq核心概念和术语
简介 越来越多的消息中间件很容易让人产生混淆,在学习一种消息中间件的时候,最好先了解他的几种抽象概念,方便你理解,明白了这些概念,你学习起来的时候也就得心应手,同时也是使用好RabbitMQ的基础. ...
- Java--基础命名空间和相关东西(JAVA工程师必须会,不然杀了祭天)
java.lang (提供利用 Java 编程语言进行程序设计的基础类)java.lang.annotation(提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互)java.lang.inst ...
- mysql升级到5.7时间戳(timestamp)默认值报错
原文:mysql升级到5.7时间戳报错 往数据库里创建新表的时候报错: [Err] 1067 - Invalid default value for 'updateTime' DROP TABLE I ...
- MyEclipse迅速
MyEclipse迅速 1.详细例如以下图 2.提示原因 3.解决方案 版权声明:本文博主原创文章.博客,未经同意不得转载.
- ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Fram ...
- wordpress如何判断手机、平板还是PC并显示对应的内容-Mobile Detect
wordpress如何判断是手机.平板还是PC访问,并针对性的显示特定的内容?Mobile Detect 这个轻量级PHP 类库能够很好的实现这个功能.而且Mobile Detect也有wordpre ...
- DevOps技术路线图
来自roadmap.sh github地址 自己整理的百度脑图中文版
- node 后台管理插件forever
在一台计算机上手动跑Node项目简单,node xx.js就搞定了,想让Node项目后台运行,虽然不能直接用node命令搞定,但是在安装了forever这个包以后,还是很轻松的.不过要是在远程服务器上 ...
- 图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)
原文:图像滤镜艺术--编码基础(Photoshop基础变换的代码实现) 自从上一篇博客写完之后,到现在已经有段时间了,这段时间不是不想接着写,只是想做的更好了在写出来给大家看呵呵. 今天,我将给大家介 ...
- dotnet core 跨平台编译发布
vs2017 建立的项目,在项目目录 ,执行 dotnet publish -r ubuntu.15.04-x64 dotnet publish -r linux-x64 dotnet publish ...