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

C#使用Entity Framework插入数据时已赋值ID仍触发SqlException:ID列不允许为空的问题排查

问题分析与解决方案

我来帮你拆解这个问题:你明明在代码里给ID赋值为3了,但插入数据库时还是触发了“不能插入NULL”的错误,核心原因是Entity Framework(EF)对int类型主键的默认处理逻辑在搞鬼。

为什么会出现这个问题?

EF默认会把int类型的主键识别为「自增标识列(Identity)」——也就是说,哪怕你在代码里手动给ID赋了值,EF也会直接忽略这个值,转而期望数据库自动生成ID。但你的数据库表Productos的ID列并没有设置成自增(或者EF的模型配置和数据库实际配置不匹配),导致插入时EF根本没把你赋值的ID传给数据库,数据库自然就报“必须提供ID,不能为NULL”的错误了。

解决步骤

1. 修改EF模型的主键生成策略

你的Modelo.Producto类里,ID只标记了[Key],没有明确告诉EF你要手动控制ID的值。你需要添加[DatabaseGenerated]特性,指定主键不由数据库生成:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Modelo
{
    [Table("Productos")]
    public class Producto
    {
        [Key]
        // 关键修改:指定主键由代码手动赋值,而非数据库生成
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int ID { get; set; }
        [Required]
        public string Nombre { get; set; }
        [Required]
        public double Precio { get; set; }
    }
}

2. 同步数据库表的配置

如果你的Productos表的ID列之前被设置成了自增(IDENTITY),那即使改了EF配置,插入时还是会冲突。你需要检查数据库表结构:

  • 打开SQL Server Management Studio,找到DBPROYECTO.dbo.Productos表
  • 右键→设计,查看ID列的「标识规范」属性
    • 如果要手动赋值ID,把「是标识」改成否
    • 如果想让数据库自动生成ID,那你完全不用在代码里给ID赋值,EF会自动处理这个过程

3. 额外排查点

  • 检查DAL.Producto.Agregar方法里有没有意外重置producto.ID的代码
  • 确认你的Modelo.Contexto类的OnModelCreating方法里,有没有给Productos设置主键自增的额外配置

修改完成后,重新运行代码,EF就会把你赋值的ID=3正常传递给数据库,插入操作就能成功执行了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:13:13