.NET 8 Preview AOT Web API项目中使用Dapper.Aot时SqlConnection无Query等查询方法的问题
.NET 8 Preview AOT Web API项目中使用Dapper.Aot时SqlConnection无Query等查询方法的问题
你遇到的这个问题其实是Dapper.AOT和传统Dapper核心库的用法差异导致的——毕竟Dapper.AOT是专门为AOT编译场景设计的,它放弃了传统Dapper依赖的动态扩展方法(这种方式在AOT环境下会因为反射/动态代码生成的限制而无法工作),改用了编译时生成代码的模式,所以你没法直接在SqlConnection上调用Query这类扩展方法。
下面给你两种可行的解决方式:
方法一:使用Dapper静态类的Query方法
把原来的con.Query<Program>(...)改成调用静态的Dapper.Query方法,传入你的连接对象和查询语句即可:
using Microsoft.Data.SqlClient; using Dapper; using System.Data; // ... 你的连接初始化代码 using var con = new SqlConnection(_connectionString); con.Open(); // 改用静态Query方法 var test5 = Dapper.Query<Program>(con, "SELECT Name, Acronym FROM Programs");
方法二:使用Dapper.Command对象构建查询
Dapper.AOT还提供了Command<T>类型,这种方式更适合复杂的参数化查询场景,步骤如下:
using var con = new SqlConnection(_connectionString); con.Open(); // 创建对应实体的Command查询对象 var queryCommand = new Dapper.Command<Program>("SELECT Name, Acronym FROM Programs"); // 执行查询并获取结果 var test5 = queryCommand.Execute(con);
额外需要注意的几个细节
- 确保你的
Program实体类上的[DapperAot]特性确实生效了,而且类的属性名称和SQL查询返回的列名一致;如果列名和属性名不匹配,可以用[Column("ColumnName")]特性做映射。 - 检查你安装的Dapper.AOT包是否是最新版本,毕竟.NET 8还在预览阶段,Dapper.AOT的适配可能会有更新修复。
- 确认你的项目已经正确配置了AOT编译:在项目文件(.csproj)里要包含
<PublishAot>true</PublishAot>,并且使用的是符合要求的.NET 8预览版SDK。 - 可以尝试清理项目的
bin和obj目录,重新生成解决方案,确保Dapper.AOT在编译时正确生成了对应的执行代码。
备注:内容来源于stack exchange,提问作者Jason Durnil
相关产品推荐
相关产品推荐

