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

ASP.NET Core 6.0中IdentityUser无法创建DbSet的问题求助

解决InvalidOperationException: Cannot create a DbSet for 'IdentityUser'的问题

核心问题

你在启动配置里指定Identity使用IdentityUser作为用户类型,但你的NiniveContext中注册的是自定义的AspNetUser实体类,EF Core无法找到IdentityUser对应的DbSet,导致报错。

解决步骤

1. 让自定义Identity实体继承官方基类

修改你的AspNetUser及其他Identity相关实体,继承Microsoft Identity对应的基类:

// AspNetUser.cs
public partial class AspNetUser : IdentityUser
{
    // 你的自定义字段
}

// AspNetRole.cs
public partial class AspNetRole : IdentityRole
{
    // 你的自定义字段
}

// AspNetRoleClaim.cs
public partial class AspNetRoleClaim : IdentityRoleClaim<string>
{
    // 你的自定义字段
}

// AspNetUserClaim.cs
public partial class AspNetUserClaim : IdentityUserClaim<string>
{
    // 你的自定义字段
}

// AspNetUserLogin.cs
public partial class AspNetUserLogin : IdentityUserLogin<string>
{
    // 你的自定义字段
}

// AspNetUserToken.cs
public partial class AspNetUserToken : IdentityUserToken<string>
{
    // 你的自定义字段
}

2. 修改DbContext继承关系

将NiniveContext从普通DbContext改为继承IdentityDbContext,并指定你的自定义用户、角色类型:

public partial class NiniveContext : IdentityDbContext<AspNetUser, AspNetRole, string>
{
    public NiniveContext()
    {
    }

    public NiniveContext(DbContextOptions<NiniveContext> options)
        : base(options)
    {
    }

    // 保留你的DbSet定义
    public virtual DbSet<AspNetRole> AspNetRoles { get; set; }
    public virtual DbSet<AspNetRoleClaim> AspNetRoleClaims { get; set; }
    public virtual DbSet<AspNetUser> AspNetUsers { get; set; }
    public virtual DbSet<AspNetUserClaim> AspNetUserClaims { get; set; }
    public virtual DbSet<AspNetUserLogin> AspNetUserLogins { get; set; }
    public virtual DbSet<AspNetUserToken> AspNetUserTokens { get; set; }

    // 保留OnModelCreating方法(如果有)
}

3. 调整启动配置中的Identity注册

把AddDefaultIdentity的泛型参数从IdentityUser换成你的AspNetUser:

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("NINIVE_DB");

builder.Services.AddDbContext<NiniveContext>(options =>
        options.UseNpgsql(connectionString));

// 替换为自定义的AspNetUser
builder.Services.AddDefaultIdentity<AspNetUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<NiniveContext>();

额外注意事项

  • 如果你的Identity实体使用非string类型的主键(比如int),需要调整基类的泛型参数,例如IdentityUser<int>、IdentityRole<int>,同时DbContext要改为IdentityDbContext<AspNetUser, AspNetRole, int>。
  • 检查OnModelCreating方法中的表映射配置,确保和数据库表名(如AspNetUsers、AspNetRoles)匹配,避免映射错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:28:38