You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:02:43