返回

.NET 高性能 ORM Dapper 使用完整教程:快速上手 + 事务管理示例

2025-07-27 .NET ORM Dapper 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 都能提供简洁、高效的解决方案。欢迎结合你的具体业务场景尝试,并按照最佳实践管理连接与事务!

顶部