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

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.EntityFrameworkCore 8.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 09:28:02