ASP.NET Core自定义IdentityUser外键约束异常问题求助
解决EF外键指向错误表的问题
1. 先把Identity DbContext的用户表配置坐实
你的UserEntity继承自IdentityUser,默认EF会把它映射到AspNetUsers表,但为了避免歧义,最好显式指定:
public class AppIdentityDbContext : IdentityDbContext<UserEntity> { public AppIdentityDbContext(DbContextOptions<AppIdentityDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // 明确指定UserEntity对应AspNetUsers表 builder.Entity<UserEntity>().ToTable("AspNetUsers"); } }
2. 在业务DbContext里给SpaceShip配置正确的外键
因为用了两个独立DbContext,业务库(比如AppDbContext)里没直接加UserEntity的DbSet,EF容易识别错关联表,得手动指定:
public class AppDbContext : DbContext { public DbSet<SpaceShip> SpaceShips { get; set; } public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // 给SpaceShip的UserId外键指定关联到AspNetUsers表 builder.Entity<SpaceShip>() .HasOne<UserEntity>() .WithMany() // 如果UserEntity里没定义SpaceShip的集合,就这么写 .HasForeignKey(s => s.UserId) .HasPrincipalKey(u => u.Id) .ToTable("AspNetUsers"); } }
要是想彻底让业务DbContext不依赖UserEntity类型,也可以这么写:
builder.Entity<SpaceShip>() .HasOne() .WithMany() .HasForeignKey(s => s.UserId) .HasPrincipalKey("Id") // 直接写用户表的主键列名 .ToTable("AspNetUsers");
3. 重新生成迁移修复数据库
之前的迁移已经生成了错误的约束,得重新生成迁移来修正:
# 要是还没把错误迁移更新到数据库,先删除它 Remove-Migration # 生成新的迁移 Add-Migration FixSpaceShipForeignKey # 更新数据库 Update-Database
要是已经把错误迁移更到数据库了,直接生成新迁移即可,EF会自动生成修改约束的SQL脚本。
关键注意点
- 两个DbContext必须使用同一个数据库连接字符串,否则跨DbContext的外键约束本身不合法。
- 确保
UserEntity的主键类型和SpaceShip的UserId类型完全一致(比如默认Identity的Id是string,别改成int类型)。
内容的提问来源于stack exchange,提问作者József Kiss
相关产品推荐
相关产品推荐

