Dapper怎么使用Dapper.Contrib进行CRUD Dapper.Contrib快速操作指南

Dapper.Contrib 可实现免手写 SQL 的高性能 CRUD,需安装 Dapper 和 Dapper.Contrib 包、引入命名空间、实体标记 [Table] 和 [Key] 特性,并调用 Get/GetAll/Insert/Update/Delete 等扩展方法。

直接用 Dapper.Contrib 就能绕过手写 SQL,实现接近原生 Dapper 性能的 CRUD 操作,关键在实体标记和方法调用——不复杂但容易忽略细节。

安装与基础引用

先通过 NuGet 安装两个包(缺一不可):

  • dotnet add package Dapper
  • dotnet 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(id) 但传入的是字符串或 Guid 类型 → 确保类型和数据库字段一致

基本上就这些。