Dapper lanza una excepción inválida al intentar establecer un valor booleano devuelto por MySQL

dapper mysql mysql.data

Pregunta

Tengo esta clase

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public bool IsValidated { get; set; }
}

Y lo estoy poblando con este sql usando dapper:

var users = connection.Query<User>("SELECT userId, userName, TRUE `IsValidated` FROM user WHERE [...]").ToList();

Cuando ejecuto esto obtengo este error:

Error al analizar la columna 2 (IsValidated = 1 - Int64)

He pasado por el código dapper y el sqldatareader dice que esa columna es int64 , por lo que parece que .NET Mysql Connector está pensando que 'TRUE' (que debería ser tinyint en MYSQL) es un int64 .

Encontré este informe de error que decía que para todas las versiones de INT (INT, BIGINT, TINYINT, SMALLINT, MEDIUMINT), el conector .NET estaba devolviendo int64. Sin embargo, este fue un error en MySQL 5.0 y se solucionó, estoy usando 5.5. Tengo la versión de mysql.data 6.4.3.0

He "resuelto" este problema seleccionándolo todo en una tabla temporal con la columna IsValidated declarada como BOOL , pero esta es una solución pésima.

Respuesta popular

No estoy familiarizado con Drapper, pero dado que MySQL devolverá cualquier booleano como int (normalmente tinyint), una opción podría ser cambiar tu clase a la siguiente:

public class User  
{  
    public int UserId { get; set; }  
    public string UserName { get; set; }
    private bool _isValidated = false;
    public bool IsValidated
    { 
        get{ return _isValidated;}
        set{ _isValidated = Boolean.Parse(value); }
   }  
}  

Alternativamente, pruebe un molde en el sql

cast(TRUE `IsValidated` as bit)

No lo he intentado, pero al menos tienes una sugerencia. Todo lo mejor.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow