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

.NET 6+SQL Server:Identity主键列无法自动赋值报错求助

SQL Server中EF无法自动赋值Identity主键列的解决方案

错误信息

System.Data.Entity.Infrastructure.DbUpdateException: 更新条目时出错,请查看内部异常了解详细信息。
System.Data.Entity.Core.UpdateException: 更新条目时出错,请查看内部异常了解详细信息。
System.Data.SqlClient.SqlException (0x80131904):
无法将值 NULL 插入列 'ID',表 'WexusBot.dbo.wexusUsers';列不允许空值。INSERT 失败。

问题核心

虽然实体类已标记[Key]和[DatabaseGenerated(DatabaseGeneratedOption.Identity)],但EF迁移未在SQL Server中为ID列创建IDENTITY自增属性,导致插入数据时因未手动赋值触发非空约束错误,且每次迁移后需手动修改表结构。


解决方案1:修复当前迁移文件

找到刚生成的迁移文件(如test.cs),修改Up方法中ID列的创建代码,显式指定自增属性:

public override void Up()
{
    CreateTable(
        "dbo.wexusUsers",
        c => new
            {
                ID = c.Int(nullable: false, identity: true), // 新增identity: true配置
                TUID = c.Long(nullable: false),
                Username = c.String(),
                PremiumExpiresAt = c.DateTime(nullable: false),
                RegisteredAt = c.DateTime(nullable: false),
                Role = c.Int(nullable: false),
            })
        .PrimaryKey(t => t.ID)
        .Index(t => t.TUID, unique: true);
}

执行命令重新更新数据库:

update-database

解决方案2:使用Fluent API替代DataAnnotations(推荐)

在DbContext的OnModelCreating方法中,通过Fluent API明确配置主键自增属性,避免注解失效问题:

using System.Data.Entity;
using System.Data.Entity.Infrastructure.Annotations;

public class YourDbContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // 配置ID为主键并设为自增
        modelBuilder.Entity<User>()
            .HasKey(u => u.ID)
            .Property(u => u.ID)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        // 配置TUID的唯一索引
        modelBuilder.Entity<User>()
            .Property(u => u.TUID)
            .HasColumnAnnotation(
                "Index", 
                new IndexAnnotation(new IndexAttribute { IsUnique = true })
            );
    }
}

重新生成迁移并更新数据库:

add-migration ConfigureIdentityViaFluent
update-database

解决方案3:修复已存在的数据库表

如果不想重新生成迁移,可直接修改现有表结构:

  1. SSMS图形界面操作:
    • 打开表设计器,选中ID列
    • 在右侧「列属性」中找到「标识规范」,将「是标识」设为「是」,标识种子和增量均设为1
  2. SQL语句操作:
    -- 注意:执行前确保表中无数据,或现有ID值不与自增序列冲突
    ALTER TABLE wexusUsers ALTER COLUMN ID INT IDENTITY(1,1);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:17:41