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
相关产品推荐
相关产品推荐

