一.概述
目前对于. 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 方法. "注意缓冲不是缓存".
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] - 此属性已计算, 不应作为更新的一部分
具体参考
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 的扩展包.
来源: https://www.cnblogs.com/MrHSR/p/11082111.html