ASP.NET项目中使用EF Core调用存储过程报错求助
调用带参数存储过程时的方法重载错误解决办法
问题重现
创建REST API时调用带参数的存储过程,使用以下代码时出现错误:
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter).ToList();
错误提示:
No Overload Method for SqlQuery takes 2 arguments
用户最初的代码:
[HttpGet] public async Task<ActionResult<IEnumerable<string>>> GetCompanyName(string param) { var symbolParameter = new SqlParameter("@TickerSymbol", param); var symbol= _dbContext.Database.SqlQuery<string>("p_GetCompanyInfo @TickerSymbol", symbolParameter).ToList(); }
已安装包版本:
EntityFrameworkCore 7.0.10 EntityFrameworkCore.SqlServer 7.0.10 EntityFrameworkCore.Tools 7.0.10
更新后的代码仍报错:
[ApiController] public class QuickPicksController : ControllerBase { private readonly QuickPicssContext _dbContext; public QuickPicksController(QuickPicssContext dbContext) { _dbContext = dbContext; } [HttpGet("{id}")] public async Task<ActionResult<IEnumerable<string>>> GetStockDefs(int id) { return _dbContext.QwikPikSymbols.FromSql("EXECUTE Customers_SearchCustomers @ContactName", "TEST").ToList(); } }
错误原因
EF Core 7中SqlQuery和FromSql的参数传递逻辑和旧版EF不同,主要问题点:
- 直接传递字符串参数而非
SqlParameter实例,EF Core无法识别为合法参数 - 异步方法中使用了同步的
ToList(),且未正确匹配方法重载 - 调用存储过程时未明确使用
EXEC/EXECUTE关键字(部分场景下会导致解析错误)
正确解决方案
方案1:使用Database.SqlQuery<T>调用存储过程
适用于返回非实体类型的场景,注意参数传递和异步方法的使用:
[HttpGet] public async Task<ActionResult<IEnumerable<string>>> GetCompanyName(string param) { var symbolParam = new SqlParameter("@TickerSymbol", param); // 明确使用EXEC关键字,参数用SqlParameter传递,异步用ToListAsync() var symbols = await _dbContext.Database.SqlQuery<string>( "EXEC p_GetCompanyInfo @TickerSymbol", symbolParam ).ToListAsync(); return symbols; }
方案2:使用DbSet.FromSql调用存储过程
如果存储过程返回结果对应已定义的实体(如QwikPikSymbols),需保证实体属性和返回列名匹配,同时用SqlParameter传递参数:
[HttpGet("{id}")] public async Task<ActionResult<IEnumerable<QwikPikSymbols>>> GetStockDefs(int id) { var contactNameParam = new SqlParameter("@ContactName", "TEST"); var stockDefs = await _dbContext.QwikPikSymbols .FromSql($"EXECUTE Customers_SearchCustomers @ContactName", contactNameParam) .ToListAsync(); return stockDefs; }
关键注意事项
- 必须使用
SqlParameter传递参数,既避免SQL注入,也能让EF Core正确识别参数重载 - 异步Action中务必使用
ToListAsync()等异步方法,不要混用同步操作 - 调用存储过程时建议明确加上
EXEC或EXECUTE关键字,避免EF Core解析SQL时出错 - 确保泛型类型(或实体属性)和存储过程返回的结果列完全匹配,否则会出现映射错误
内容的提问来源于stack exchange,提问作者baruti
相关产品推荐
相关产品推荐

