You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core新增记录触发SQLite NOT NULL约束失败错误如何解决?

问题原因分析

你遇到的NOT NULL约束报错是三个配置错误共同导致的:

  1. 主键配置不符合业务&自增规则要求
    你原本的复合主键CompanyId+PriceId才符合股票价格存储的业务逻辑(同一家公司可以对应多条不同时间的价格记录),修改为仅CompanyId作为主键后,同一家公司只能存储一条价格记录,且SQLite要求自增列必须是主键或主键的组成部分,单独的非主键列无法被设置为自增。
  2. 自增列属性配置缺失
    仅给PriceId加ValueGeneratedOnAdd()不足以让EF Core和SQLite将其识别为自增列,还需要额外指定自增属性,否则EF Core插入数据时不会跳过该字段的赋值,SQLite也不会自动生成该字段的值。
  3. 数据库结构未同步更新
    如果你修改模型配置后没有生成新的迁移并更新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");
});
后续操作步骤
  1. 删除之前修改主键后生成的错误迁移文件
  2. 执行Add-Migration AddPriceIdIdentity生成新的迁移
  3. 执行Update-Database将结构变更同步到SQLite数据库
  4. 原有插入代码不需要修改,插入完成后EF Core会自动将数据库生成的PriceId回写到实体对象中

内容的提问来源于stack exchange,提问作者Artur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:36:06