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

AspNetUsers表Id改为Long后创建用户遇IDENTITY_INSERT错误求助

解决AspNetUsers Id改为Long自增后创建用户的SqlException问题

你遇到的问题核心是:把AspNetUsers的Id改成自增Long类型后,ASP.NET Identity框架还在尝试给Id字段赋值,而数据库的自增列在IDENTITY_INSERT关闭状态下不允许显式插入值。下面是具体的解决方案:

问题根源

默认情况下,ASP.NET Identity使用string类型的Guid作为用户表主键。当你将Id改为long并设置为自增(identity:true)后,如果Identity框架没有被正确配置为适配long类型主键,它依然会尝试生成Guid并赋值给Id,这就触发了数据库的错误。

具体解决方案

1. 修正ApplicationUser类的定义

让你的ApplicationUser继承泛型版本的IdentityUser<long>,明确指定主键类型为long:

public class ApplicationUser : IdentityUser<long>
{
    // 你的自定义属性
    public string FullName { get; set; }
    public long? CreatedBy { get; set; }
    public DateTime? CreatedDate { get; set; }
    public DateTime? ModifiedDate { get; set; }
    public long? ModifiedBy { get; set; }
    public bool IsDeleted { get; set; }
}

2. 更新UserManager和RoleManager的泛型类型

对应的用户管理器和角色管理器也要适配long类型主键:

// 用户管理器
public class ApplicationUserManager : UserManager<ApplicationUser, long>
{
    public ApplicationUserManager(IUserStore<ApplicationUser, long> store)
        : base(store)
    {
    }

    // 可在此添加自定义用户管理逻辑
}

// 角色管理器
public class ApplicationRoleManager : RoleManager<IdentityRole<long>, long>
{
    public ApplicationRoleManager(IRoleStore<IdentityRole<long>, long> store)
        : base(store)
    {
    }
}

3. 调整DbContext的继承关系

你的数据库上下文需要继承泛型的IdentityDbContext,指定用户、角色和主键类型:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<long>, long>
{
    public ApplicationDbContext()
        : base("YourConnectionStringName")
    {
    }

    // 其他DbSet定义...
}

4. 显式配置Id为自增(可选但推荐)

在DbContext的OnModelCreating方法中,明确配置Id列的自增属性,确保EF和数据库的配置一致:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    // 配置ApplicationUser的Id为自增
    modelBuilder.Entity<ApplicationUser>()
        .Property(u => u.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
}

5. 修正创建用户代码中的类型错误

你的代码里有个明显的类型不匹配问题:user.CreatedBy = string.Empty;,但数据库里CreatedBy是long?类型,应该改成:

user.CreatedBy = null; // 或者传入对应的long类型创建者ID(如果有)

验证步骤

  1. 完成所有修改后,重新生成迁移并更新数据库(若需要)
  2. 运行创建用户的代码,此时Identity框架会停止给Id赋值,由数据库自动生成自增的long值,就不会触发IDENTITY_INSERT的错误了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:54:04