当搭建一个新项目以从 MySql 数据库获取数据库时,出现以下异常:
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)
我已经安装了以下版本的 EF 代码 dll。
但是当我启动脚手架命令时
Scaffold-DbContext“服务器= 192.168.1.103;端口= 3306;用户id=root;密码=root;数据库=测试;persistsecurityinfo=True;sslmode=无”MySql.EntityFrameworkCore
我得到了例外。
我的数据库只有一张测试表
我还安装了 .Net Connector for mysql
感谢您的帮助。
当实体框架尝试将
BLOB
或 VARBINARY
类型列从 MySQL 映射到 .NET
时,通常会出现错误“无法将类型为‘System.Byte[]’的对象转换为类型为‘System.String’”键入错误。实体框架可能会尝试将二进制数据解释为 string
而不是 byte[]
。
以下是使用实体框架搭建 MySQL 数据库时解决此问题的方法:
检查数据库表并查找具有
BLOB
、VARBINARY
或类似二进制数据类型的任何列。
如果您知道哪些列受到影响,您可以通过 Fluent API 配置模型类中的属性以使用正确的数据类型 (
byte[]
)。
例如,在您的
DbContext
课程中:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<MyEntity>()
.Property(e => e.BinaryColumn)
.HasColumnType("BLOB");
// Configure other binary columns similarly
}
如果您使用
Scaffold-DbContext
命令,请尝试添加 --data-annotations
选项以确保 EF Core 使用注释正确解释列类型。此外,请确保您使用的是最新兼容版本的 MySQL EF Core 提供程序。
这是
Scaffold-DbContext
命令与 Pomelo.EntityFrameworkCore.MySql
的示例:
Scaffold-DbContext "your_connection_string" Pomelo.EntityFrameworkCore.MySql --data-annotations -o Models
如果您使用
Pomelo.EntityFrameworkCore.MySql
,则可以在映射到二进制列的属性上指定 [Column(TypeName = "BLOB")]
属性。
示例:
public class MyEntity
{
public int Id { get; set; }
[Column(TypeName = "BLOB")]
public byte[] BinaryData { get; set; }
}
如果列可为空,请确保该属性在实体类中定义为
byte[]?
以避免映射问题。
通过在模型配置中指定数据类型,EF Core 应正确解释二进制数据并避免此转换异常。如果您需要有关设置的特定部分的帮助,请告诉我!