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

.NET 6+MySQL/MariaDB环境下aspnetuserroles表不存在问题求助

.NET 6 Identity + Pomelo MySQL:重命名用户角色表后仍提示“aspnetuserroles不存在”的解决方法

问题场景

基于.NET 6的项目,集成JWT、Identity框架,使用Pomelo.EntityFrameworkCore.MySql 6.0.2连接MySQL/MariaDB数据库。已在OnModelCreating()方法中重命名Identity相关表,但调用UserManager.GetRolesAsync()获取用户角色时,仍触发错误:Table 'aspnetuserroles' doesn't exist。虽已按网上方案调用base.OnModelCreating(modelBuilder)后用.ToTable()修改表名,但问题未解决。

问题原因

你的ApplicationDbContext继承自IdentityDbContext<Usuario, Rol, string>,即使用了自定义的用户实体Usuario和角色实体Rol,但在配置表名时,错误地针对基类IdentityUser、IdentityRole、IdentityUserRole进行配置,导致EF Core未正确映射自定义实体对应的关联表,依然沿用默认表名规则。

解决方案

修改OnModelCreating()中的配置逻辑,针对自定义实体及其对应关联类进行表名映射:

修正后的ApplicationDbContext代码

public class ApplicationDbContext : IdentityDbContext<Usuario, Rol, string>
{
    protected readonly string ConnectionString;

    public ApplicationDbContext()
    {
    }

    public ApplicationDbContext(string connectionString)
    {
        ConnectionString = connectionString;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder options)
    {
        base.OnConfiguring(options);
        options.LogTo(message => Debug.WriteLine(message), new[] { DbLoggerCategory.Database.Command.Name })
            .EnableSensitiveDataLogging()
            .UseMySql(ConnectionString, ServerVersion.AutoDetect(ConnectionString));
    }

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

    // 注意:DbSet应指向自定义实体,而非基类IdentityUser
    public virtual DbSet<Usuario> Usuarios { get; set; }
    public virtual DbSet<Rol> Roles { get; set; }

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

        // 配置自定义用户实体的表名
        modelBuilder.Entity<Usuario>().ToTable("usuarios");
        // 配置自定义角色实体的表名
        modelBuilder.Entity<Rol>().ToTable("roles");
        // 配置用户-角色关联表(对应IdentityDbContext的泛型参数类型)
        modelBuilder.Entity<IdentityUserRole<string>>()
            .ToTable("usuarioroles")
            .HasKey(ur => new { ur.UserId, ur.RoleId });
        // 配置用户登录表
        modelBuilder.Entity<IdentityUserLogin<string>>()
            .HasKey(ul => new { ul.LoginProvider, ul.ProviderKey, ul.UserId });
    }
}

额外注意事项

  1. 确保自定义实体继承正确:Usuario需继承IdentityUser<string>,Rol需继承IdentityRole<string>
  2. 重新生成并执行数据库迁移,确保数据库表名已更新为自定义名称(usuarios、roles、usuarioroles)
  3. 删除旧的迁移文件(若存在),避免旧配置残留
  4. 注入UserManager和RoleManager时,使用泛型版本:UserManager<Usuario>和RoleManager<Rol>

内容的提问来源于stack exchange,提问作者Germán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:35:31