.NET 高性能 ORM Dapper 使用完整教程:快速上手 + 事务管理示例
2025-07-27 3864 0
什么是 Dapper?
Dapper 是由 Stack Overflow 团队开发的开源微型 ORM(Object‑Relational Mapper),其设计目标是极致性能。它直接扩展了 IDbConnection 接口,通过少量扩展方法(如 Query<T>, Execute, QueryAsync<T> 等)将 SQL 查询结果映射为 C# POCO 对象,性能接近纯 ADO.NET,每次调用开销非常低。
相比 Entity Framework 等全功能 ORM,Dapper 更轻量、不做变更跟踪、不生成 SQL,但提供原生 SQL 控制力,适合对性能要求高、需要手写 SQL 的项目。
快速上手:安装与基础 CRUD
安装方式极简单,在项目中使用 NuGet:
dotnet add package Dapper
建立连接并查询示例:
using var conn = new SqlConnection(connectionString);
conn.Open();
var items = conn.Query<Product>("SELECT * FROM Products WHERE CategoryId = @CategoryId", new { CategoryId = 1 });
Query<T>() 返回强类型对象列表,QueryAsync<T>() 为异步版本。
Execute() 和 ExecuteAsync() 用于执行插入、更新、删除操作。
参数化查询与安全性
Dapper 支持强参数化查询,自动防止 SQL 注入。例如:
var user = await conn.QuerySingleOrDefaultAsync<User>(
"SELECT * FROM Users WHERE Email = @Email",
new { Email = userEmail });
匿名类型或 DynamicParameters 都可传参;Dapper 会自动映射列名与属性名,大小写不敏感。
多结果集与复杂映射
利用 QueryMultipleAsync(),可以在一个请求中接收多个结果集;还支持多对象映射(例如一对多关系) via QueryAsync<TFirst, TSecond, TResult>(…) 等高级函数,方便处理联表查询并填充复杂模型。
事务管理:BeginTransaction、Commit、Rollback
同步事务
标准事务使用方式:
using var conn = new SqlConnection(connectionString);
conn.Open();
using var tran = conn.BeginTransaction();
try
{
conn.Execute("INSERT INTO Customers(Name) VALUES(@Name)", new { Name = "Alice" }, transaction: tran);
conn.Execute("UPDATE Orders SET CustomerName = @Name WHERE OrderId = @OrderId", new { Name = "Alice", OrderId = 123 }, transaction: tran);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
要点是调用 BeginTransaction(),并在每个 Dapper 调用中传入 transaction: 参数。事务范围内异常需执行回滚,确保数据一致性。
异步事务
在异步场景下,可以使用 BeginTransactionAsync()、CommitAsync() 和 RollbackAsync():
await conn.OpenAsync();
using var tran = await conn.BeginTransactionAsync();
try
{
await conn.ExecuteAsync(insertSql, param, transaction: tran);
await conn.ExecuteAsync(updateSql, param, transaction: tran);
await tran.CommitAsync();
}
catch
{
await tran.RollbackAsync();
throw;
}
这样可以与 Web API 或异步应用无缝集成。
事务最佳实践与注意事项
务必打开连接:使用事务时需调用 conn.Open()(或 OpenAsync())。不自动打开可能导致异常。
尽量缩短事务生命周期,避免长时间锁定数据库,提高并发性能。
使用 try...catch 包裹事务逻辑,确保异常时调用 Rollback(),避免部分提交造成数据不一致。
在 .NET Core / ASP.NET Core 中使用 Dapper
在 ASP.NET Core 项目中,通常采用 Repository 模式封装 Dapper 操作组件:
- 在 Startup 或 Program.cs 中注入 IDbConnection(SqlConnection)为 Scoped。
- 在 Repository 中通过依赖注入获取连接,并调用 Dapper 方法。
- 若涉及多表插入或修改,可通过统一传入同一个 IDbTransaction 实例到多个 repository 方法,实现跨多个操作的一致提交或回滚。
例如:
using var tran = conn.BeginTransaction();
await userRepo.Create(user, tran);
await orderRepo.AddOrder(order, tran);
tran.Commit();
上述代码确保两次操作在同一事务下成功提交。
总结与应用选择建议
何时选择 Dapper?
- 当你希望对 SQL 有完全控制、要求极致性能、无需复杂 ORM 功能(如懒加载、变更跟踪)时,Dapper 是绝佳选择。
- 适用场景:高性能 API、大量只读查询、已有数据库模式、需要手写优化 SQL 的项目。
- Dapper 特点:开源、跨平台、支持 .NET 5/6/7/8 和 .NET Standard、支持异步、参数化、事务、存储过程等。
通过安装、参数化查询、多结果集映射及事务管理示例,你已经掌握了 Dapper 的核心用法。无论你是在小型 Web API 项目,还是高并发数据访问场景,Dapper 都能提供简洁、高效的解决方案。欢迎结合你的具体业务场景尝试,并按照最佳实践管理连接与事务!