欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net core系列 66 Dapper介绍--Micro-ORM

程序员文章站 2023-10-26 16:23:46
一.概述 目前对于.net的数据访问ORM工具很多,EF和EF Core是一个重量级的框架。最近在搭建新的项目架构,来学习一下轻量级的数据访问ORM工具Dapper。Dapper支持SQL Server,MySQL,Sqlite,SqlCE,Firebird等的高性能Micro-ORM(微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接口,可参考如下:

    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方法。  “注意缓冲不是缓存”。

        

    (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的扩展包。