无法将类型“System.String”的对象转换为类型“System.Byte []”错误 MYSQL NET CORE 3.1

Posted

技术标签:

【中文标题】无法将类型“System.String”的对象转换为类型“System.Byte []”错误 MYSQL NET CORE 3.1【英文标题】:Unable to cast object of type 'System.String' to type 'System.Byte[]' Error MYSQL NET CORE 3.1 【发布时间】:2020-10-28 06:01:59 【问题描述】:

我正在使用 NET CORE 3.1 实现 mysql.EntityFramework.Core。 获取数据时,它会给出错误“无法将'System.String'类型的对象转换为'System.Byte []'类型”。 示例:

public new async Task<IList<Rol>> GetAllAsync(Expression<Func<Rol, bool>> condition)
    
        var roles = await _dbContext.Rol  // <=== HERE Line 26 RolDataStore
            .Where(condition).ToListAsync();

        return roles;
    

在我的配置DALContext中说:

public static void ConfigureDALContext(this IServiceCollection services, string dbConnection)
    
        services.AddDbContext<MyDbContext>(options =>
        
            options.UseMySQL(dbConnection);
        );
        
    

模特角色:

public class Rol : IEntity, ISoftDeleteEntity

    private Guid _id;
    public Guid Id
    
        get
        
            return _id == Guid.Empty ? Guid.NewGuid() : _id;
        
        set
        
            _id = value;
        
    

    public string Nombre  get; set; 
    public string Descripcion  get; set; 
    public virtual ICollection<Usuario> Usuarios  get; set; 
    public DateTime? FechaBaja  get; set; 


还有表格“Rol”:


例外:

System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Byte[]'.
   at System.Data.Common.DbDataReader.GetFieldValue[T](Int32 ordinal)
   at MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue[T](Int32 ordinal)
   at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
Excepción producida: 'System.InvalidCastException' en System.Private.CoreLib.dll
System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Byte[]'.
   at System.Data.Common.DbDataReader.GetFieldValue[T](Int32 ordinal)
   at MySql.Data.MySqlClient.MySqlDataReader.GetFieldValue[T](Int32 ordinal)
   at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync[TSource](IQueryable`1 source, CancellationToken cancellationToken)
   at GPS.DAL.DataStores.RolDataStore.GetAllAsync(Expression`1 condition) in D:\PROYECTOS\GPSimracing\gpsimracing\api\GPS.DAL\DataStores\RolDataStore.cs:line 26

有人可以帮忙解决这个问题吗?

【问题讨论】:

【参考方案1】:

最后通过安装 Nuget "Pomelo.EntityFrameworkCore.MySql" 并卸载 Mysql.Core 解决了。 这会自动将其从 Char 解析为 Guid。

enter link to solution in other post

【讨论】:

你安装的是什么版本的 Polemo,目前是 3.2.4,这并没有解决问题【参考方案2】:

数据库中的Id 列是一个字符串。这是从查询返回的内容。但是 C# 端的Id 属性是Guid。 C# Guid 值是二进制的;你那里不匹配。您需要在某处拥有Guid.Parse(),或者将C# Id 属性更改为字符串。

另外,guid 是固定长度的,所以如果你真的这样做,varchar(64) 似乎有点奇怪。根据how they are formatted,您需要char(32)、char(36)、char(38) 或char(68) 之一。

【讨论】:

将表的 ID 类型更改为“Char (36)”,但 Mysql.Core 仍未解析。在“映射”中我做不到,但调查我发现使用“Pomelo.EntityFrameworkCore.MySql”它会自动解析它。我试过了,它奏效了。最重要的是,你帮助我理解了它。非常感谢您对我的帮助!

以上是关于无法将类型“System.String”的对象转换为类型“System.Byte []”错误 MYSQL NET CORE 3.1的主要内容,如果未能解决你的问题,请参考以下文章

提示:无法将类型为“System.DateTime”的对象强制转换为类型“System.String”。

无法将类型为“System.DateTime”的对象强制转换为类型“System.String”

无法将类型“System.String”的对象转换为类型“System.Byte []”错误 MYSQL NET CORE 3.1

无法将“System.String”类型的对象转换为“System.Int32”类型。关于 Blazor/Razor 路由参数

无法将“System.String”类型的对象转换为 C# 中的“Oracle.DataAccess.Client.OracleParameter”类型

无法将类型为“Newtonsoft.Json.Linq.JObject”的对象转换为类型“System.Collections.Generic.Dictionary`2[System.String,S