首页 新闻 搜索 专区 学院

net core ef for mysql bool 类型字段定义问题

1
[已解决问题] 解决于 2018-07-31 16:10

RT,以前的ef for mysql ,定义c# bool, mysql tinyint(1),来存储bool 值,net core 里边会报错, Unable to cast object of type 'System.Boolean' to type 'System.SByte'.

如果用bit(1),好像值更新有问题, false 也会存成1, 这个问题有遇到的吗?

死神的背影的主页 死神的背影 | 小虾三级 | 园豆:660
提问于:2018-07-31 15:13
< >
分享
最佳答案
1

在连接字符串中加上 TreatTinyAsBoolean=true 试试

奖励园豆:5
dudu | 高人七级 |园豆:37795 | 2018-07-31 15:48

找到问题了, core 里边针对mysql ,bool类型我 定义了 bit(1),正常情况下 都是可以更新匹配的,0对应false,1对应 true, 但是如果 在dbcontext 中定义表的地方 增加 HasDefaultValueSql的话, 问题就来了。

entity.Property(e => e.IsAllProduct)
.HasColumnType("bit(1)")
.HasDefaultValueSql("'1'");

比如,表A中的这个字段,默认值是 1,也就是true,当使用 context.A.Add(modelA)的时候,IsAllProduct传的值是false,也就是0, 但是ef会强制取 default的值'1',从打印出来的sql可以看出来,dudu大神 你可以试一下,应该是个 bug吧。

 

 

两个sql分别是 加了 HasDefaultValueSql 和 没加 HasDefaultValueSql 生成的sql,加了个强制取default,没加的取实体给的值

死神的背影 | 园豆:660 (小虾三级) | 2018-07-31 16:10

@死神的背影: 可以试试 .HasDefaultValue() ,并在定义 IsAllProduct 属性的地方将默认值设置为 true

dudu | 园豆:37795 (高人七级) | 2018-07-31 16:17

补充一下,连接串 加 TreatTinyAsBoolean=true 这句是OK的,加上就好了

死神的背影 | 园豆:660 (小虾三级) | 2018-07-31 16:24

@死神的背影: 果然解决了,很神奇的问题

沐见南 | 园豆:202 (菜鸟二级) | 2019-07-06 21:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册