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
相关产品推荐
相关产品推荐

