Dapper在尝试设置从MySQL返回的布尔值时引发无效的强制转换异常

Dapper在尝试设置从MySQL返回的布尔值时引发无效的强制转换异常,mysql,dapper,mysql.data,Mysql,Dapper,Mysql.data,我有这门课 public class User { public int UserId { get; set; } public string UserName { get; set; } public bool IsValidated { get; set; } } 我使用dapper用以下sql填充它: var users = connection.Query<User>("SELECT userId, userName, TRUE `IsValidat

我有这门课

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public bool IsValidated { get; set; }
}
我使用dapper用以下sql填充它:

var users = connection.Query<User>("SELECT userId, userName, TRUE `IsValidated` FROM user WHERE [...]").ToList();
var users=connection.Query(“选择userId,userName,TRUE`IsValidated`FROM user WHERE[…])。ToList();
当我运行此命令时,会出现以下错误:

分析列2时出错(IsValidated=1-Int64)

我已经浏览了简洁的代码&sqldatareader说该列是
int64
,所以看起来.netmysql连接器认为“TRUE”(在Mysql中应该是tinyint)是
int64

我确实发现,对于INT的所有版本(INT、BIGINT、TINYINT、SMALLINT、MEDIUMINT),.NET连接器都返回int64。然而,这是MySQL5.0中的一个bug&已经修复,我使用的是5.5。我有mysql.data版本6.4.3.0


我已经“解决”了这个问题,将它全部选择到一个临时表中,
IsValidated
列声明为
BOOL
,但这是一个糟糕的解决方案。

我不熟悉Drapper,但由于MySQL将以int(通常为tinyint)返回任何布尔值,一个选项是将您的类更改为以下内容:

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); }
   }  
}  
或者,在sql中尝试强制转换

cast(TRUE `IsValidated` as bit)

我没试过,但至少你有个建议。祝你一切顺利。

我一直对降级感到不安,因为你有丢失信息的风险。我们可能会在Dapper中添加扩展性挂钩,以便您可以定义向下投射规则。。。目前还没有决定,但这不是贬低,是吗?MySQL返回一个极小值(TRUE)。System.Data.SQLite也会出现此问题。Dapper只接受映射到Int64的整数数据类型。