Dapper将MySql的BIT(1)数据类型映射为ulong而不是布尔值

15

请问有没有人遇到过Dapper和MySQL中的上述情况。在我所有MySQL表(5.1)中,数据类型为BIT(1)或BIT的字段,Dapper只会将其返回为ulong (UInt64)。我正在使用MySql.Data.MySqlClient,但我在尝试转换的EF中没有这样的问题。

感谢任何帮助。


我的直觉告诉我这是mysql驱动程序的问题...你能用纯ado.net重现这个问题吗...例如选择列并获取值...查看类型? - Sam Saffron
简单的解决方法是向您的类型添加一个阴影属性或字段。 - Sam Saffron
@Sam Saffron:我无法通过纯ADO.NET重现它,而且我尝试了PetaPoco,它没有遇到同样的问题。我试图进一步调查,MySql实际上会返回0表示false,1表示true,为什么它显示为ulong类型仍然让我困惑。你能详细解释一下你所说的“阴影属性”是什么,以及我如何使用它来解决这个问题吗? - Gboyega Sulaiman
@Sam Saffron:我尝试从数据库中仅选择一个bool字段,但我发现它在GetStructDeserializer的直接转换(T)val处停止。0或1(作为ulong)不能直接转换为bool。 GetClassDeserializer也会出现类似的问题。像您为char和char所做的特殊处理一样,是否会产生性能损失? - Gboyega Sulaiman
我在SQLite和INTEGER方面有类似的问题。在SQLite数据库中,主键是一个INTEGER(自增仅适用于INTEGER,由于某种原因),但我的POCO具有int类型。我期望它可以顺利地转换为int(NHibernate可以做到!)。我真的无法理解Dapper代码中生成转换的部分(以及为什么这个生成的转换失败了),我找不到任何好的文档来解释生成的IL到底是做什么的。@sam-saffron - 添加一个影子属性是hackish的,我希望有一个实际的解决方案! - Christian Droulers
@SamSaffron 我也遇到了这个问题。虽然我想出了一个解决方法,但我的ORM也受到了影响。在我的情况下,MySqlDataReader r 导致 BITr[i] 变成了 UInt64。 这有点烦人。 我现在需要在我的ORM中修补它。 但是对于Dapper,我可以绕过它吗?因为实际上我不需要读取该值。 它仅用于我的where语句。我只需避免在该表中使用*并且它只有3个列(+2个用于ID和标志)。 - user34537
2个回答

3
在MySQL中,类型Boolean被映射到MySQL的Tinyint(1)。也许你需要将它强制转换为Boolean(0=false/1=true),Convert.toBoolean(UInt64)可能会有所帮助(参见http://msdn.microsoft.com/en-us/library/33f2zy48.aspx)。
@Christian Droulers: SQLite的行为类似。

-1
为什么不在你的SQL查询中进行强制转换?
cast(myField using TINYINT(1)) as myField 

这里不确定类型,但当我的数据库类型与对象不匹配时,我通常会这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接