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

.NET 8中如何正确排除Identity默认表?解决映射忽略警告

解决Identity排除默认表时的迁移警告问题

问题原因

你遇到的警告是因为IdentityDbContext<APIUser>的base.OnModelCreating(builder)会自动映射所有Identity相关实体(包括IdentityUserToken、IdentityUserClaim等),之后调用builder.Ignore<>()相当于“先注册映射再取消”,EF Core会检测到这种冲突并抛出警告。即使调整base.OnModelCreating的执行顺序也无法避免——因为IdentityDbContext的核心逻辑就是自动配置全套Identity实体。

解决方案:手动配置所需Identity实体,不依赖IdentityDbContext的自动映射

直接继承DbContext,只手动配置你需要的Identity实体,从根源避免多余实体被映射。

步骤1:修改APIContext代码

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;

public class APIContext(DbContextOptions<APIContext> options) : DbContext(options)
{
    // 声明需要使用的Identity实体DbSet
    public DbSet<APIUser> User { get; set; }
    public DbSet<IdentityRole> Role { get; set; }
    public DbSet<IdentityUserRole<string>> UserRoles { get; set; }

    protected override void OnModelCreating(ModelBuilder builder)
    {
        // 1. 配置APIUser(继承IdentityUser<string>)的表名与基础字段
        builder.Entity<APIUser>(b =>
        {
            b.ToTable("User");
            b.HasKey(u => u.Id);
            b.Property(u => u.UserName).IsRequired();
            b.Property(u => u.Email).IsRequired();
        });

        // 2. 配置IdentityRole的表名
        builder.Entity<IdentityRole>(b =>
        {
            b.ToTable("Role");
            b.HasKey(r => r.Id);
        });

        // 3. 配置用户-角色关联表的表名、复合主键与外键
        builder.Entity<IdentityUserRole<string>>(b =>
        {
            b.ToTable("UserRoles");
            b.HasKey(ur => new { ur.UserId, ur.RoleId });
            
            b.HasOne<APIUser>()
                .WithMany()
                .HasForeignKey(ur => ur.UserId)
                .IsRequired();
            
            b.HasOne<IdentityRole>()
                .WithMany()
                .HasForeignKey(ur => ur.RoleId)
                .IsRequired();
        });

        // 无需调用base.OnModelCreating,也无需写builder.Ignore<>()
        // 仅配置需要的实体,其余Identity默认实体不会被映射
    }
}

步骤2:确保APIUser继承IdentityUser<string>

你的APIUser类需保持继承IdentityUser<string>,以兼容Identity系统:

public class APIUser : IdentityUser<string>
{
    // 自定义字段(如有)
}

步骤3:保留Program.cs中的Identity配置

Program.cs里的AddIdentity和AddEntityFrameworkStores无需修改,因为APIContext已包含Identity所需的核心实体:

builder.Services.AddIdentity<APIUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = false)
    .AddEntityFrameworkStores<APIContext>();

验证效果

执行迁移命令时,不会再出现The entity type 'IdentityUserToken' was first mapped explicitly and then ignored的警告,同时只会生成你配置的User、Role、UserRoles三张表,其余Identity默认表不会被创建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:03:12