

新闻资讯
技术学院Dapper 删除数据本质是执行参数化 DELETE SQL 语句,无内置删除方法;需注意事务、软删、批量和级联等场景,推荐按主键/条件单删、事务多表删、UPDATE 软删、IN 或表值参数批量删。
Dapper 删除数据本质就是执行一条 DELETE SQL 语句,它不自带“删除方法”,而是通过 Execute(或 ExecuteAsync)直接运行参数化 SQL。操作简单、高效,但需注意事务、软删、批量和级联等实际场景。
最常用的方式:按主键或条件删除一条记录,使用参数化防止 SQL 注入。
using (var conn = new SqlConnection(connStr))
{
int rows = conn.Execute("DELETE FROM Products WHERE Id = @Id", ne
w { Id = 123 });
Console.WriteLine($"影响 {rows} 行");
}
@ 或 ?,取决于驱动):using (var conn = new MySqlConnection(connStr))
{
int rows = conn.Execute("DELETE FROM users WHERE id = @id", new { id = 456 });
}
✅ 提示:Dapper 会自动打开连接(如果关闭),无需手动调用 Open();执行完自动释放资源。
当要同时删主表和从表(如删除订单同时删订单项),必须用事务保证原子性。
IDbTransaction 显式控制:using (var conn = new SqlConnection(connStr))
{
conn.Open();
using (var tran = conn.BeginTransaction())
{
try
{
conn.Execute("DELETE FROM OrderItems WHERE OrderId = @OrderId", new { OrderId }, tran);
conn.Execute("DELETE FROM Orders WHERE Id = @OrderId", new { OrderId }, tran);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
不真正删数据,只标记为“已删除”,适合审计、恢复、权限控制等场景。
public bool IsDeleted { get; set; } = false;
conn.Execute("UPDATE Products SET IsDeleted = 1 WHERE Id = @Id", new { Id = 789 });
WHERE IsDeleted = 0
IsDeleted 字段建索引(尤其数据量大时)避免循环逐条删(慢且易超时),推荐以下两种主流方式:
IN 最多支持约 2100 个参数,超量需分批。CREATE TYPE IntList AS TABLE (Id INT)),再传 DataTable 或 IEnumerable基本上就这些。Dapper 删除不复杂,但容易忽略事务安全、软删一致性、批量性能边界这些关键点。按需选择,别硬套一种模式。