EF Core 5使用FromSqlRaw执行存储过程提示相同键已添加错误
根因分析
这个异常和你返回的行数据内主键值重复没有关系,从堆栈信息可以直接定位到报错发生在EF Core构建结果集列名到实体属性的映射阶段:
- 报错位置是
FromSqlQueryingEnumerable.BuildIndexMap方法,该方法会把存储过程返回的结果集列名作为key存入字典,和你定义的实体属性做映射 - 提示里的
Key: site_no指的是存储过程返回的结果集中存在两个同名的site_no列,存入字典时因为key重复触发异常,完全不是行数据里site_no值重复的问题
这也能解释你之前的尝试都没有生效的原因:不管是配置无键实体、还是配置复合主键,解决的都是行数据主键重复的场景,和列名重复的问题完全不相关,哪怕你改用临时表返回数据,只要查询逻辑里重复输出了site_no字段,就还是会报错。刚好你提到存储过程是两个表的关联查询,大概率是SELECT语句里同时取了两个表的site_no字段且没有指定别名,才会出现重复列名。
排查&解决步骤
- 把你传入
FromSqlRaw的存储过程调用语句复制到SQL Server Management Studio中直接执行,查看结果集的列名,一定能找到两个名为site_no的列 - 修改存储过程的查询逻辑:
- 删掉不需要的重复列,确保返回的所有列名唯一
- 如果两个
site_no字段都需要保留,给重复的字段加独立别名,比如b.site_no as relate_site_no
- 如果你给重复列加了别名,对应在
MissingData实体中添加和别名同名的属性即可。
内容的提问来源于stack exchange,提问作者Gaz83
相关产品推荐
相关产品推荐

