EF Core 3.1.9用FromSqlRaw调用存储过程报底层读取器字段不足错误如何解决
故障根因大概率为Windows更新附带的SqlClient驱动版本变动导致的结果集读取逻辑变化
第一步:优先验证存储过程结果集返回逻辑
你可以直接用SSMS使用程序连接字符串的账号登录对应数据库,执行以下语句:
DECLARE @WorkOrderId INT = 38385; EXEC [dbo].[WorkOrderBOMGridABS] @WorkOrderId;
查看输出面板是否先出现了(N 行受影响)这类计数信息:
- 若存在该信息,说明你的存储过程未添加
SET NOCOUNT ON配置,更新后的SqlClient驱动会把执行过程中返回的行数计数当做第一个结果集读取,该结果集没有任何字段,直接触发字段数少于预期的错误。 - 解决方法:在存储过程开头第一行添加
SET NOCOUNT ON;即可,这是存储过程调用的标准最佳实践,也可以临时将项目引用的Microsoft.Data.SqlClient/System.Data.SqlClient包降级到更新前的版本验证问题是否消失。
第二步:验证无键实体配置
调用存储过程返回的模型大多为无键实体,部分EF Core小版本更新后会对未显式配置的无键实体做校验,要求必须返回主键字段,不存在就会抛出该错误。你可以在DbContext的OnModelCreating方法中添加显式配置:
modelBuilder.Entity<WorkOrderBOMGridABS>(entity => { entity.HasNoKey(); // 显式声明为无键实体 // 可根据实际情况添加字段映射,避免列名大小写、别名不匹配的问题 entity.Property(e => e.你的字段名).HasColumnName("存储过程返回的对应列名"); });
第三步:验证数据库账号权限
如果你的Windows更新同时安装了SQL Server的安全补丁,可能会重置部分账号的存储过程执行权限。用程序连接字符串使用的账号登录SSMS执行存储过程,确认没有权限报错、拦截提示,避免错误信息作为第一个结果集返回触发异常。
内容的提问来源于stack exchange,提问作者Bob Pen Light
相关产品推荐
相关产品推荐

