环境:asp.net ef mysql Code First
问题:两张差不多的表,添加数据时其中一张表报错:存储区更新、插入或删除语句影响到了意外的行数(0)......,通过打印生成的Sql观察到,问题应该是出在自增长Id上。
添加成功表:
测试添加:
添加失败表:
测试添加:
手动给Id赋一个正常的值是能够添加成功的
使用modelBuilder.Entity<cz_t2_gz_insured_info>()
.Property(e => e.id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
注解Id字段也能正常添加。但是以往都不需要去这么做的.
Id也都是自增长列,不知道两张表有啥差别,导致ef生成的Sql语句出现Id为0的情况。
已解决:
我去掉了数据库时间的默认值:CURRENT_TIMESTAMP
表中CreateTime 使用了默认值,CURRENT_TIMESTAMP
而ef生成的实体中就会出现如下注解
该注解像是能影响主键生成的sql,一但加到CreateTime上面,打印出来的添加sql语句上就会出现Id=0,然后就会失败
去掉注解后,打印的添加Sql上的Id=0就不见了,就能成功添加了,也不晓得啥原因,
mysql插入的时候,会自动将Id=0的 Id替换为自增Id,这个你可以放心。除非Id不是自增。你要看下你EF的配置,应该是那里出了问题
没有替换啊,生成的sql不能出现Id=0 的情况,我觉得得找出啥原因出现了id=0
@JoyQY: 我说的是你可以手工insert 一条数据,把id置为0 ,你就知道 id=0 能不能插入成功。能去确定id=0是否有问题。
DatabaseGeneratedOption.Identity标识下EF认为由数据库更新,会再操作完查询数据,从新赋值到对象上