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

Entity Framework 7配置自增主键时插入NULL值问题求助

问题根源

你手动指定主键能正常插入,说明数据库中IEA_EtatsDemandes表的id_etat列没有设置IDENTITY(自增)。当你在EF中配置[DatabaseGenerated(DatabaseGeneratedOption.Identity)]或ValueGeneratedOnAdd()后,EF会认为这个值由数据库自动生成,插入时不会传递id_etat的值,但数据库该列要求非空且无自增规则,因此触发“无法插入NULL”的错误。

解决步骤

1. 修改数据库表,开启主键列自增特性

针对SQL Server,执行以下SQL语句(若表已有数据,先查询现有最大id_etat值,将IDENTITY(1,1)中的种子值设为大于现有最大值,避免冲突):

ALTER TABLE IEA_EtatsDemandes ALTER COLUMN id_etat INT IDENTITY(1,1);

也可在SSMS表设计界面,找到id_etat列,展开“标识规范”,将“是标识”设为“是”,并设置合适的标识种子与增量。

2. 配置EF实体与DbContext

实体类数据注解配置

public class IEA_EtatsDemandes
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id_etat { get; set; }

    // 其他表字段对应的属性
    public string Libelle { get; set; }
    // ...
}

DbContext Fluent API配置(与数据注解二选一即可)

在DbContext的OnModelCreating方法中添加:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<IEA_EtatsDemandes>(entity =>
    {
        entity.HasKey(e => e.id_etat);
        entity.Property(e => e.id_etat)
            .ValueGeneratedOnAdd()
            .UseIdentityColumn(); // 明确绑定SQL Server的IDENTITY机制
    });
}

3. 插入数据时不手动赋值主键

插入新数据时,无需给id_etat赋值,保持默认值即可,EF会自动忽略该值,由数据库生成自增值:

var newEtat = new IEA_EtatsDemandes
{
    Libelle = "待处理",
    // 其他属性正常赋值,不设置id_etat
};

_dbContext.IEA_EtatsDemandes.Add(newEtat);
await _dbContext.SaveChangesAsync();

// 此时newEtat.id_etat会被EF自动填充为数据库生成的自增值

额外注意

  • 若之前通过反向工程生成过实体类,建议重新生成以保证模型与数据库同步。
  • 若无法修改数据库结构(不推荐),可改用EF通过数据库序列生成主键值,但可靠性不如数据库自增,需额外创建序列并配置EF绑定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:15:41