EF Core脚手架生成MySQL数据库上下文时抛出System.InvalidCastException类型转换异常
EF Core脚手架生成MySQL数据库上下文时抛出System.InvalidCastException类型转换异常
问题场景
我在使用EF Core脚手架命令从MySQL数据库生成实体类和DbContext时,抛出了以下类型转换异常:
System.InvalidCastException: Unable to cast object of type 'System.Byte[]' to type 'System.String'. at MySql.Data.MySqlClient.MySqlDataReader.GetString(Int32 i) at MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue[T](Int32 ordinal) at MySql.EntityFrameworkCore.Scaffolding.Internal.MySQLDataReaderExtension.GetValueOrDefault[T](DbDataReader reader, String name) at MySql.EntityFrameworkCore.Scaffolding.Internal.MySQLDatabaseModelFactory.GetTables(DbConnection connection, Func`3 tableFilter) at MySql.EntityFrameworkCore.Scaffolding.Internal.MySQLDatabaseModelFactory.Create(DbConnection connection, DatabaseModelFactoryOptions options) at MySql.EntityFrameworkCore.Scaffolding.Internal.MySQLDatabaseModelFactory.Create(String connectionString, DatabaseModelFactoryOptions options) at Microsoft.EntityFrameworkCore.Scaffolding.Internal.ReverseEngineerScaffolder.ScaffoldModel(String connectionString, DatabaseModelFactoryOptions databaseOptions, ModelReverseEngineerOptions modelOptions, ModelCodeGenerationOptions codeOptions) at Microsoft.EntityFrameworkCore.Design.Internal.DatabaseOperations.ScaffoldContext(String provider, String connectionString, String outputDir, String outputContextDir, String dbContextClassName, IEnumerable`1 schemas, IEnumerable`1 tables, String modelNamespace, String contextNamespace, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames, Boolean suppressOnConfiguring, Boolean noPluralize) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContextImpl(String provider, String connectionString, String outputDir, String outputDbContextDir, String dbContextClassName, IEnumerable`1 schemaFilters, IEnumerable`1 tableFilters, String modelNamespace, String contextNamespace, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames, Boolean suppressOnConfiguring, Boolean noPluralize) at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContext.<>c__DisplayClass0_0.<.ctor>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0() at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
我当前的环境配置:
- 已安装
MySql.EntityFrameworkCore8.0.33版本 - 已安装MySQL Connector/NET 8.0.33
- 使用的脚手架命令:
Scaffold-DbContext "server=192.168.1.103;port=3306;user id=root;password=root;database=test;persistsecurityinfo=True;sslmode=None" MySql.EntityFrameworkCore
- 数据库中仅包含一个简单的
test表
解决思路与方案
这个异常本质是EF Core的官方MySQL驱动在读取数据库元数据(比如information_schema中的表/列信息)时,把二进制类型字段错误地当成字符串类型读取导致的,给你几个实用的解决方向:
1. 尝试指定仅生成目标表
有时候驱动在扫描全库元数据时会触发非用户表的兼容问题,你可以在脚手架命令中明确指定要生成的表,缩小扫描范围:
Scaffold-DbContext "server=192.168.1.103;port=3306;user id=root;password=root;database=test;persistsecurityinfo=True;sslmode=None" MySql.EntityFrameworkCore -t test
2. 更换为社区维护的Pomelo驱动
官方的MySql.EntityFrameworkCore驱动偶尔会有这类元数据读取的兼容性问题,社区维护的Pomelo.EntityFrameworkCore.MySql通常兼容性更好,步骤如下:
- 先卸载已安装的
MySql.EntityFrameworkCore包 - 安装对应你.NET版本的Pomelo驱动(比如.NET 6选6.0.x版本,.NET 7选7.0.x)
- 使用Pomelo驱动执行脚手架命令:
Scaffold-DbContext "server=192.168.1.103;port=3306;user id=root;password=root;database=test;persistsecurityinfo=True;sslmode=None" Pomelo.EntityFrameworkCore.MySql -t test
3. 检查驱动与.NET/MySQL服务器的版本兼容性
确保MySql.EntityFrameworkCore的版本和你的.NET SDK版本、MySQL服务器版本完全兼容:
- 如果你用的是.NET 6/7/8,优先选择对应大版本的驱动(比如.NET 6配8.0.32+的驱动)
- 如果你的MySQL服务器版本低于5.7,建议降级驱动到8.0.28左右的稳定版,或者升级MySQL服务器到5.7+
4. 检查数据库字符集配置
部分特殊的字符集/排序规则也可能触发这个问题,你可以尝试把数据库的默认字符集改为utf8mb4,排序规则设为utf8mb4_general_ci,然后重新执行脚手架命令。
备注:内容来源于stack exchange,提问作者user2097439
相关产品推荐
相关产品推荐

