记录一次.NET CORE下的异常.
异常信息如下:
System.InvalidCastException: Unable to cast object of type ‘System.Boolean’ to type ‘System.SByte’.
通常发生在EF Core查询数据时使用Mysql ,同时表中含有类型为tinyint(1)列的情况下。
EF Core将tinyint(int) 映射为System.SByte类型(按理说应该映射成System.Byte,实际上就是System.Byte,也不知道为啥处理的时候使用SByte,学艺不精,有知道的大佬请一定告知,谢谢!),当我们从Mysql拿数据时,Mysql会将tinyint(int)转换成Boolean类型返回,EF Core拿到这个数据时,会按照映射关系将其转换成System.SByte,然后就会出现以下异常。
System.InvalidCastException: Unable to cast object of type ‘System.Boolean’ to type ‘System.SByte’.
Mysql 的 tinyint 类型可以设置为有符号,也可设置为无符号,所以映射成System.SByte没有问题。
两个解决方案
(1)修改映射关系,在代码中指定实体类中Boolean类型属性的对应数据库类型为bit(1),这样就会形成一个bit(1)<==>boolean的映射。
映射是数据库类型和.NET类型之间的映射,如果你没有指定实体中属性对应的数据库类型,那么EFCore会根据数据库架构,推断出每个属性对应的数据库类型