出现异常无法将“System.Byte[]”类型的对象转换为“System.String”类型。当脚手架 mysql EF

问题描述 投票:0回答:1

当搭建一个新项目以从 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。

enter image description here

但是当我启动脚手架命令时

Scaffold-DbContext“服务器= 192.168.1.103;端口= 3306;用户id=root;密码=root;数据库=测试;persistsecurityinfo=True;sslmode=无”MySql.EntityFrameworkCore

我得到了例外。

我的数据库只有一张测试表

enter image description here

我还安装了 .Net Connector for mysql

enter image description here

感谢您的帮助。

c# mysql entity-framework
1个回答
0
投票

当实体框架尝试将

BLOB
VARBINARY
类型列从 MySQL 映射到
.NET
时,通常会出现错误“无法将类型为‘System.Byte[]’的对象转换为类型为‘System.String’”键入错误。实体框架可能会尝试将二进制数据解释为
string
而不是
byte[]

以下是使用实体框架搭建 MySQL 数据库时解决此问题的方法:

1.识别二进制列

检查数据库表并查找具有

BLOB
VARBINARY
或类似二进制数据类型的任何列。

2.使用 Fluent API 配置二进制列

如果您知道哪些列受到影响,您可以通过 Fluent API 配置模型类中的属性以使用正确的数据类型 (

byte[]
)。

例如,在您的

DbContext
课程中:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<MyEntity>()
        .Property(e => e.BinaryColumn)
        .HasColumnType("BLOB");

    // Configure other binary columns similarly
}

3.更新脚手架选项

如果您使用

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

4.使用 MySQL 特定的属性

如果您使用

Pomelo.EntityFrameworkCore.MySql
,则可以在映射到二进制列的属性上指定
[Column(TypeName = "BLOB")]
属性。

示例:

public class MyEntity
{
    public int Id { get; set; }

    [Column(TypeName = "BLOB")]
    public byte[] BinaryData { get; set; }
}

5.检查可空字节数组

如果列可为空,请确保该属性在实体类中定义为

byte[]?
以避免映射问题。

通过在模型配置中指定数据类型,EF Core 应正确解释二进制数据并避免此转换异常。如果您需要有关设置的特定部分的帮助,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.