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

MySQL连接出现The given key was not present in the dictionary异常求助

问题描述

连接MySQL数据库时抛出如下异常:

Exception: An error occurred while executing the command definition. See the inner exception for details.
StackTrace:    at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
   at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at Lorax.DataModel.GenericRepository.GenericRepository`1.GetAll()
   at LoraxQueueConsumer.LoraxScheduler.CheckDB_Conn() in D:\Lorax\AthenaQueueConsumer\LoraxScheduler.cs:line 154
Inner Exception: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at MySql.Data.MySqlClient.CharSetMap.GetCharacterSet(DBVersion version, String CharSetName)
   at MySql.Data.MySqlClient.MySqlField.SetFieldEncoding()
   at MySql.Data.MySqlClient.NativeDriver.GetColumnData(MySqlField field)
   at MySql.Data.MySqlClient.NativeDriver.GetColumnsData(MySqlField[] columns)
   at MySql.Data.MySqlClient.Driver.GetColumns(Int32 count)
   at MySql.Data.MySqlClient.ResultSet.LoadColumns(Int32 numCols)
   at MySql.Data.MySqlClient.ResultSet..ctor(Driver d, Int32 statementId, Int32 numCols)
   at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
   at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
   at MySql.Data.MySqlClient.MySqlDataReader.Close()
   at MySql.Data.MySqlClient.MySqlCommand.ResetReader()
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.Entity.EFMySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
Source: System.Data.Entity

使用环境:

  • MySQL版本:8.0.35
  • Entity Framework版本:5.0.0
  • MySQL Connector/NET版本:6.8.3

备注:使用MySQL 8.0.28时无异常,已尝试在连接字符串添加charset=utf8mb3;,问题仍存在。

原因分析

核心问题是MySQL Connector/NET 6.8.3版本过于陈旧,该版本发布于2014年,完全不支持MySQL 8.0系列的新特性与字符集更新。从MySQL 8.0.28到8.0.35的版本迭代中,字符集相关的内部定义发生了变化,而老版本的CharSetMap字典中没有对应新字符集的键,导致抛出KeyNotFoundException。

解决方案

1. 升级MySQL Connector/NET版本(推荐)

将Connector/NET升级到8.0.x系列版本(建议与MySQL服务器版本匹配,比如8.0.35),新版本完全兼容MySQL 8.0的所有特性,包括字符集的更新。升级后,连接字符串可指定charset=utf8mb4;(MySQL 8.0默认字符集),无需再强制使用utf8mb3。

2. 检查并统一数据库字符集(临时 workaround)

如果暂时无法升级Connector,可执行以下操作:

  • 登录MySQL服务器,检查目标数据库、表及列的字符集:
    SHOW CREATE DATABASE your_database_name;
    SHOW CREATE TABLE your_table_name;
    
  • 将所有涉及的数据库、表字符集修改为Connector 6.8.3支持的类型(如utf8mb3或latin1):
    ALTER DATABASE your_database_name CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;
    ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;
    
  • 确保连接字符串中明确指定charset=utf8mb3;,并重启应用程序与MySQL服务。

3. 验证EF5兼容性

EF5.0.0版本虽发布较早,但新版本的MySQL Connector/NET 8.0.x仍支持与EF5协同工作。升级Connector后,可通过简单查询验证连接是否正常,若出现兼容性问题,可调整EF配置文件(如app.config/web.config)中的数据库提供程序设置。

内容的提问来源于stack exchange,提问作者Akshay Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:50:54