存储过程在SSMS中正常运行但C#代码调用结果异常
问题:ASP.NET Core 6调用SQL Server存储过程返回结果异常
我在SQL Server中创建了一个存储过程,传入ID即可返回数据库中匹配的记录。该存储过程在SSMS 2018中执行完全正常,但在ASP.NET Core 6项目中调用时,无法得到预期结果。调用时仅部分情况返回正确结果,且出现ID正确,但Key、EN-US等字段值与预期不符的问题。
预期返回结果示例:
id: 5
Key: 7h48f
EN-US: Header-1
实际返回结果示例:
id: 5
Key: jsoej
EN-US: Mixing
相关信息
传入的ID集合值
1, 3, 4, 6 & 7
C#调用代码
private List<HeaderModel> getHeaderNames(List<TagIDModel> allID) { var allHeaders = new List<HeaderModel>(); for (int i = 0; i < counter; i++) { var header = _context.Translation.FromSqlRaw("EXEC getHeader @key = {0}", allID[i].TagID).ToList(); allHeaders.Add(new HeaderModel { HeaderName = header[0].EnUs }); } return removeDoubles(allHeaders); }
存储过程代码
ALTER PROCEDURE [dbo].[getHeader] @key int AS SELECT Translation.id, [Key], [EN-US], [NL-NL], [CN-ZH] FROM Translation JOIN ParameterGroup ON Translation.id = ParameterGroup.ParameterGroupName JOIN TagData ON TagData.id=ParameterGroup.id WHERE TagData.id = @key
排查与解决思路
校验EF Core实体映射
确认Translation实体类的属性与数据库字段完全匹配,尤其是带特殊字符的字段(如EN-US),需通过[Column("EN-US")]特性显式指定映射关系,避免EF Core自动匹配出错。清除EF Core查询缓存
循环调用存储过程时,EF Core可能复用之前的查询缓存导致结果混乱。可在每次调用后清除跟踪,或使用AsNoTracking()禁用跟踪:var header = _context.Translation.FromSqlRaw("EXEC getHeader @key = {0}", allID[i].TagID) .AsNoTracking() .ToList();规范参数传递方式
确保传入参数值正确,建议使用命名参数调用存储过程,避免位置参数引发的潜在问题:var header = _context.Translation.FromSqlRaw("EXEC getHeader @key = @tagId", new SqlParameter("@tagId", allID[i].TagID)) .ToList();检查存储过程连接逻辑
虽然SSMS中执行正常,但需确认多表连接条件是否合理。比如TagData.id=ParameterGroup.id的关联是否符合业务逻辑,错误的外键关联会导致返回意外的关联数据。确认循环变量正确性
代码中counter变量未定义,需确保其值等于allID.Count,否则会出现循环次数错误,导致ID处理不完整或重复。
内容的提问来源于stack exchange,提问作者Jasper Leijten
相关产品推荐
相关产品推荐

