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
相关产品推荐
相关产品推荐

