EF Core MySQL Scaffold报错:给定键‘3072’不在字典中求解决方案
解决EF Core Scaffold MySQL时出现的KeyNotFoundException(Key '3072')
问题场景
执行EF Core Scaffold命令生成MySQL数据库模型:
dotnet ef dbcontext scaffold "server=example.com;port=3306;user=admin;password=xxxxxxxx;database=abc_db;CharSet=utf8" MySql.EntityFrameworkCore -o Models -f
抛出如下错误:
System.Collections.Generic.KeyNotFoundException: The given key '3072' was not present in the dictionary. at System.Collections.Generic.Dictionary`2.get_Item(TKey key) at MySql.Data.MySqlClient.MySqlField.SetFieldEncoding() at MySql.Data.MySqlClient.MySqlField.set_CharacterSetIndex(Int32 value) 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.MySqlClient.MySqlCommand.ExecuteReader() at MySql.Data.MySqlClient.MySqlCommand.ExecuteScalar()
环境信息:MySQL 8.0.35(Linux x86_64,支持TLSv1.2/TLSv1.3),已尝试将连接字符串字符集改为utf8mb4,问题未解决。
解决方案
1. 升级MySQL驱动包版本
错误中的Key '3072'对应MySQL 8.0引入的utf8mb4_0900_ai_ci排序规则,旧版本的MySQL驱动(MySql.EntityFrameworkCore/MySql.Data)未添加该字符集的映射,导致字典查找失败。
- 查看当前项目中MySQL相关包版本:
dotnet list package - 升级到与MySQL服务器版本匹配的驱动包(推荐8.0.35版本,与服务器版本一致):
dotnet add package MySql.EntityFrameworkCore --version 8.0.35
2. 连接字符串中指定兼容的排序规则
如果升级驱动后仍有问题,可在连接字符串中显式指定驱动支持的排序规则(如utf8mb4_general_ci):
server=example.com;port=3306;user=admin;password=xxxxxxxx;database=abc_db;CharSet=utf8mb4;Collation=utf8mb4_general_ci
3. 临时修改数据库表的排序规则(可选)
若无法升级驱动,可临时将数据库中使用utf8mb4_0900_ai_ci排序规则的表/字段改为utf8mb4_general_ci,执行Scaffold命令生成模型后再改回原规则。
执行修改排序规则的SQL示例:
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
内容的提问来源于stack exchange,提问作者Da Do
相关产品推荐
相关产品推荐

