C#怎么使用Dapper微ORM_C#如何提高数据库性能【指南】

张开发
2026/4/10 20:19:30 15 分钟阅读

分享文章

C#怎么使用Dapper微ORM_C#如何提高数据库性能【指南】
Dapper 查询更快但易出错因其不跟踪对象、不生成SQL、无延迟加载所有SQL和映射需手动控制常见错误包括参数名不匹配、空值未处理、事务未显式传参、异步上下文阻塞及多映射splitOn字段名不一致等。为什么 Dapper 查询比 Entity Framework 快但容易出错因为 Dapper 不做对象跟踪、不生成 SQL、不自动处理延迟加载所有 SQL 和映射都由你控制。快是真快错也是真错——比如参数名拼错、类型不匹配、没处理空值它不会提醒你只会默默返回空或抛 SqlException。常见错误现象NullReferenceException 在读取结果时出现实际是查询没返回数据但代码直接调用 .First()InvalidOperationException: The parameterized query ... expects parameter xxx...参数名和 SQL 中不一致。用 QuerySingleOrDefaultT() 代替 QueryFirstOrDefaultT() 如果业务上「必须有且仅有一个」能提前暴露数据异常所有参数一律用匿名对象或强类型类传入避免用 IDictionarystring, object —— 容易键名大小写不一致字符串参数别直接拼接进 SQL哪怕只是固定值也必须走参数化写成 WHERE Name name而不是 WHERE Name name Execute 和 Query 混用导致事务不生效很多人以为只要开了 SqlTransaction所有操作就自动参与事务。但 Dapper 的 Execute增删改和 Query查本身不感知事务上下文——除非你显式把 transaction 参数传进去。使用场景批量导入后校验失败要整体回滚。connection.Execute(sql, param, transaction: tx) —— transaction 参数不能漏connection.Query(sql, param, transaction: tx) 同理即使只是 SELECT也可能影响一致性判断比如查中间状态别依赖 connection.BeginTransaction() 后的“隐式绑定”Dapper 不维护连接级事务上下文如果用 using var tx conn.BeginTransaction();记得在 tx.Commit() 前所有 Dapper 调用都带 transaction: tx异步方法QueryAsync卡主线程检查同步上下文QueryAsync 看似异步但在 WinForms 或某些 ASP.NET 同步上下文里可能被同步阻塞表现就是界面卡住或请求超时。根本原因不是 Dapper而是 await 后默认会尝试捕获并回到原始上下文。 Mokker AI AI产品图添加背景

更多文章