.NET Core2.1升级至.NET6后DatabaseFacade ExecuteReader报错CS1739
.NET 6中DatabaseFacade执行原生SQL时ExecuteReader参数错误的解决方法
EF Core从2.x升级到6.x后,RelationalCommand.ExecuteReader的API签名发生了变更,原来的parameterValues命名参数已被移除,导致你的代码编译报错。
以下是适配.NET 6的修改后的代码:
public static RelationalDataReader ExecuteSqlQuery(this DatabaseFacade databaseFacade, string sql, params object[] parameters) { var concurrencyDetector = databaseFacade.GetService<IConcurrencyDetector>(); using (concurrencyDetector.EnterCriticalSection()) { var rawSqlCommand = databaseFacade .GetService<IRawSqlCommandBuilder>() .Build(sql, parameters); var connection = databaseFacade.GetService<IRelationalConnection>(); // 构建RelationalCommandParameterObject封装所需参数 var parameterObject = new RelationalCommandParameterObject( connection, rawSqlCommand.ParameterValues, null, null, null); return rawSqlCommand.RelationalCommand.ExecuteReader(parameterObject); } }
关键变更说明:
- .NET 6的EF Core要求通过
RelationalCommandParameterObject对象传递连接、参数值等执行上下文信息,不再支持单独传入parameterValues参数。 - 创建
RelationalCommandParameterObject实例时,传入数据库连接和参数值即可适配原有逻辑,其余可选参数(如事务、取消令牌等)可根据实际需求补充。
如果你的场景是查询实体类型,也可以直接使用EF Core 6提供的SqlQuery<T>扩展方法简化代码:
// 示例:查询返回指定实体类型的列表 var results = databaseFacade.SqlQuery<YourEntity>("SELECT * FROM YourTable WHERE Id = @p0", entityId).ToList();
内容的提问来源于stack exchange,提问作者Alireza Banouie
相关产品推荐
相关产品推荐

