.NET5 WebAPI对接MySQL时如何获取重复记录异常的ErrorCode
解决方案
你遇到的问题是DbUpdateException是EF Core封装的外层异常,MySQL驱动抛出的原生错误信息、错误码都包裹在它的InnerException属性中,类型为MySqlException,按以下步骤处理即可:
先引入对应MySQL驱动的命名空间:
- 若使用MySqlConnector驱动(.NET Core/.NET 5+推荐):
using MySqlConnector; - 若使用MySql.Data驱动:
using MySql.Data.MySqlClient;
- 若使用MySqlConnector驱动(.NET Core/.NET 5+推荐):
修改异常捕获块的逻辑,强转内层异常后读取对应字段:
{ try { module.Id = Guid.NewGuid(); await _moduleRepository.Add(module); await _uow.CompleteAsync(); return true; } catch (DbUpdateException ex) { // 判断内层异常是否为MySQL原生异常 if (ex.InnerException is MySqlException mysqlEx) { // MySQL重复条目错误码固定为1062 if (mysqlEx.Number == 1062) { // 这里可以拿到完整的DuplicateEntry提示,也可以提取重复字段值做定制化返回 var duplicateMsg = mysqlEx.Message; var errorCode = mysqlEx.ErrorCode; logger.LogWarning("Module - 重复记录入库错误: {Msg}, 错误码: {Code}", duplicateMsg, errorCode); // 这里可返回自定义业务提示给前端,示例:return new ApiResult { Code = 400, Msg = "当前记录已存在,请勿重复提交" }; } else { // 其他MySQL错误逻辑 logger.LogWarning("Module - 数据库操作错误: {Msg}, 错误码: {Code}", mysqlEx.Message, mysqlEx.ErrorCode); } } else { // 非MySQL触发的DbUpdate异常逻辑 logger.LogWarning("Module - Add Error: " + ex.Message); } return false; } }
补充说明
MySqlException的Number属性值1062对应唯一约束冲突的重复录入错误,是MySQL服务端固定返回的错误码,和驱动版本无关- 如果仅需要判断是否是重复录入错误,无需解析异常文本,直接判断
Number == 1062即可,稳定性更高
内容的提问来源于stack exchange,提问作者a2ron44
相关产品推荐
相关产品推荐

