.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:修复已存在的数据库表
如果不想重新生成迁移,可直接修改现有表结构:
- SSMS图形界面操作:
- 打开表设计器,选中
ID列 - 在右侧「列属性」中找到「标识规范」,将「是标识」设为「是」,标识种子和增量均设为1
- 打开表设计器,选中
- SQL语句操作:
-- 注意:执行前确保表中无数据,或现有ID值不与自增序列冲突 ALTER TABLE wexusUsers ALTER COLUMN ID INT IDENTITY(1,1);
内容的提问来源于stack exchange,提问作者itsReinsy
相关产品推荐
相关产品推荐

