dapper.contrib 可实现免手写 sql 的高性能 crud,需安装 dapper 和 dapper.contrib 包、引入命名空间、实体标记 [table] 和 [key] 特性,并调用 get/getall/insert/update/delete 等扩展方法。

直接用 Dapper.Contrib 就能绕过手写 SQL,实现接近原生 Dapper 性能的 CRUD 操作,关键在实体标记和方法调用——不复杂但容易忽略细节。
安装与基础引用
先通过 NuGet 安装两个包(缺一不可):
dotnet add package Dapperdotnet add package Dapper.Contrib
代码中必须同时引入命名空间:
using Dapper;using Dapper.Contrib.Extensions;
实体类要加特性标记
Dapper.Contrib 不靠约定猜表名或主键,而是依赖特性显式声明。最简配置示例如下:
[Table("Users")]<br>public class User<br>{<br> [Key]<br> public int Id { get; set; }<br> public string Name { get; set; }<br> public DateTime CreatedAt { get; set; }<br>}注意点:
-
[Table]必须指定数据库表名,不能省略 -
[Key]标识主键字段,仅一个字段可用;若主键非自增或需手动赋值,可加[ExplicitKey] -
[Computed]用于数据库计算列(如GETDATE()),插入/更新时自动跳过 - 不加任何标记的属性默认参与插入和更新
四大核心方法直接上手
所有方法都是 IDbConnection 的扩展,连接打开后即可调用:
-
查单条:
connection.Get<user>(1)</user>→ 等效SELECT * FROM Users WHERE Id = @Id -
查全部:
connection.GetAll<user>()</user>→ 返回IEnumerable<user></user> -
插一条:
int newId = connection.Insert(new User { Name = "Alice" });→ 自增主键自动返回,非自增则返回影响行数 -
删/改:
connection.Update(user)或connection.Delete(user),都按[Key]字段匹配操作
支持事务传参:connection.Insert(user, transaction),适合多步一致性操作。
批量操作与常见避坑
批量插入、更新、删除也内置支持:
-
connection.Insert(new[] { u1, u2, u3 })→ 一次插入多条,返回主键数组 -
connection.Update(new[] { u1, u2 })→ 按主键批量更新
容易出错的地方:
- 实体没加
[Table]或[Key]→ 运行时报InvalidOperationException: No key defined - 主键字段名不是
Id且未标[Key]→ 查不到、插不进 - 用
Get<t>(id)</t>但传入的是字符串或 Guid 类型 → 确保类型和数据库字段一致
基本上就这些。










