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")]
public class User
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public DateTime CreatedAt { get; set; }
}注意点:
-
[Table]必须指定数据库表名,不能省略 -
[Key]标识主键字段,仅一个字段可用;若主键非自增或需手动赋值,可加[ExplicitKey] -
[Computed]用于数据库计算列(如GETDATE()),插入/更新时自动跳过 - 不加任何标记的属性默认参与插入和更新
四大核心方法直接上手
所有方法都是 IDbConnection 的扩展,连接打开后即可调用:
-
查单条:
connection.Get→ 等效(1) SELECT * FROM Users WHERE Id = @Id -
查全部:
connection.GetAll→ 返回() IEnumerable -
插一条:
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但传入的是字符串或 Guid 类型 → 确保类型和数据库字段一致(id)
基本上就这些。










