ASP.NET Core Web API中EF Core调用存储过程遇source空值异常
排查ArgumentNullException(Parameter 'source')的解决步骤
这个错误说明你调用Count()的对象listaEmpleadosDTO是null,根源是上游数据获取或映射环节返回了null而非空集合。以下是针对性排查和修复方案:
1. 修正仓库方法的返回逻辑
确保GetExtensionesEmpleados不会返回null,EF Core的FromSqlRaw在无数据时会返回空集合而非null,但如果你的方法里有手动返回null的逻辑,必须修正:
// 错误示例:无数据时返回null public IEnumerable<Empleado> GetExtensionesEmpleados() { var data = _context.Empleados.FromSqlRaw("EXEC GetExtensionesIntranet").ToList(); return data.Count == 0 ? null : data; } // 正确示例:始终返回集合(空或有数据) public IEnumerable<Empleado> GetExtensionesEmpleados() { return _context.Empleados.FromSqlRaw("EXEC GetExtensionesIntranet").ToList() ?? Enumerable.Empty<Empleado>(); }
2. 验证存储过程的执行结果
直接在SQL Server Management Studio中执行EXEC GetExtensionesIntranet,确认:
- 是否有返回数据
- 返回的列名、数据类型是否与
Empleado实体的字段完全匹配(EF Core默认按名称映射,大小写敏感)
如果存储过程无返回数据,仓库方法会返回空集合,此时Count()会返回0,不会报错;如果列不匹配,EF Core会将对应字段设为默认值,但不会返回null。
3. 检查上下文的DbSet配置
确认SAPContext中已正确注册Empleado实体的DbSet:
public class SAPContext : DbContext { public DbSet<Empleado> Empleados { get; set; } // 必须存在该配置 // 其他上下文配置... }
缺少DbSet配置会导致FromSqlRaw无法正确映射结果,极端情况下可能返回null。
4. 优化控制器的DTO映射逻辑
确保在映射DTO时,上游的实体集合不为null:
// 安全写法:先判断集合是否为null,再映射 var empleados = _repository.GetExtensionesEmpleados(); var listaEmpleadosDTO = empleados?.Select(e => new EmpleadoDTO { Id = e.EmpID, Nombre = e.FirstName // 其他字段映射 }).ToList() ?? new List<EmpleadoDTO>();
5. 异步场景的额外检查
如果仓库方法是异步实现,必须确保控制器中正确使用await,否则会拿到未完成的Task对象,触发异常:
// 正确示例:await获取实际结果 var empleados = await _repository.GetExtensionesEmpleadosAsync();
内容的提问来源于stack exchange,提问作者kintela
相关产品推荐
相关产品推荐

