EF Core新增记录触发SQLite NOT NULL约束失败错误如何解决?
问题原因分析
你遇到的NOT NULL约束报错是三个配置错误共同导致的:
- 主键配置不符合业务&自增规则要求
你原本的复合主键CompanyId+PriceId才符合股票价格存储的业务逻辑(同一家公司可以对应多条不同时间的价格记录),修改为仅CompanyId作为主键后,同一家公司只能存储一条价格记录,且SQLite要求自增列必须是主键或主键的组成部分,单独的非主键列无法被设置为自增。 - 自增列属性配置缺失
仅给PriceId加ValueGeneratedOnAdd()不足以让EF Core和SQLite将其识别为自增列,还需要额外指定自增属性,否则EF Core插入数据时不会跳过该字段的赋值,SQLite也不会自动生成该字段的值。 - 数据库结构未同步更新
如果你修改模型配置后没有生成新的迁移并更新SQLite数据库,表结构仍会保留脚手架生成时的PriceId NOT NULL约束,且没有自增属性,插入时不传值就会触发约束报错。
正确配置方案
推荐保留符合业务逻辑的复合主键配置,调整后的配置如下:
modelBuilder.Entity<Price>(entity => { // 保留复合主键,支持同公司存储多条价格记录 entity.HasKey(e => new { e.CompanyId, e.PriceId }); // 配置PriceId为自增列,插入时自动生成值 entity.Property(e => e.PriceId) .ValueGeneratedOnAdd() .UseIdentityColumn(); entity.Property(e => e.TimeStamp).IsRequired(); entity.Property(e => e.Value) .IsRequired() .HasColumnType("REAL"); });
后续操作步骤
- 删除之前修改主键后生成的错误迁移文件
- 执行
Add-Migration AddPriceIdIdentity生成新的迁移 - 执行
Update-Database将结构变更同步到SQLite数据库 - 原有插入代码不需要修改,插入完成后EF Core会自动将数据库生成的
PriceId回写到实体对象中
内容的提问来源于stack exchange,提问作者Artur
相关产品推荐
相关产品推荐

