环境:sqlserver 2017
,.net core 2.0
,EF core 2.0
1.数据库中字段类型是float
的(可空),对应实体类型也是用的float
的(可空),程序启动起来就报错,日志详情为:An exception occurred while reading a database value for property 'XXXXXX'. The expected type was 'System.Nullable`1[System.Single]' but the actual value was of type 'System.Double'. ---> System.InvalidCastException: Unable to cast object of type 'System.Double' to type 'System.Nullable`1[System.Single]'.
于是我把字段类型改为Double
解决了。
很好奇这个问题的原因是什么??
还有顺便问一下double
和Double
有什么不同??
数据库的字段:
类型:float 代表从 - 1.79E + 308 到 1.79E + 308 之间的浮点数字数据。(占用8字节)
类型:real 代表从 -3.40E + 38 到 3.40E + 38 之间的浮点数字数据。(占用4字节)
而C#中:
类型:double 代表从 -1.79769313486232e308 和 +1.79769313486232e308 之间的双精度 64 位数字(8字节)
类型:float 代表从 -3.402823e38 和 +3.402823e38 之间的单精度 32 位数字(4字节)
就是说数据库中没有double型,float就表示double值。
sql server数据库字段类型与.net的数据类型的对应关系:
real(数据库)<--> float(.NET)
float(数据库)<--> double(.NET)
System.Nullable`1[System.Single]
System.Double
一个是可为空的 Single
一个是Double,差别老大了。
不不不 ,这个我知道,只是为什么数据库中字段类型是float的,EF实体类的类型为什么不能用float的?
emm 因为 Sqlserver 的 float 最大可以是 8 字节.
这个我知道,只是为什么数据库中字段类型是float的,EF实体类的类型为什么不能用float的?
@<items>: .Net 里面的 float 是4个字节.
System.Single就是float
“System.InvalidCastException”
你想把double转成float?放不下啊!
这些我都知道。只是为什么数据库中字段类型是float的,EF实体类的类型为什么不能用float的? 这才是重点!!
@<items>:
”程序启动起来就报错”,那就调试啊,看异常出现在哪一行代码上。
我猜,是Seed里面或者其他“程序启动”时执行的代码里面,你给float类型的某个属性设置了 小数的字面值,比如 3.5
但是你没加 F 后缀,编译器理解为double类型了 。