如何解决ASP.NET Identity中自动生成重复UserId外键列的问题
问题原因
EF Core 本身有默认的外键命名约定:当你定义了导航属性时,EF 会默认将「导航属性名 + 关联实体主键名」识别为外键字段。你的 Category 类中导航属性叫 ApplicationUser,关联的 IdentityUser 主键字段为 Id,符合约定的外键名应为 ApplicationUserId,而你手动定义的外键字段名为 UserId 不符合默认约定,所以 EF 会将 UserId 识别为普通字段,自动生成额外的 ApplicationUserId 作为外键列。
解决方法
有两种常用方案,选择任意一种即可:
方案1:使用数据注解标记外键关系
直接在 Category 类中通过 [ForeignKey] 特性指定外键关联:
namespace ToDo.Models { public class Category { public int CategoryId { get; set; } [Required(ErrorMessage = "Category Name is required.")] public string CategoryName { get; set; } // 标记当前UserId为ApplicationUser导航属性的外键 [ForeignKey(nameof(ApplicationUser))] public string UserId { get; set; } public ICollection<Task> Tasks { get; set; } public ApplicationUser ApplicationUser { get; set; } } }
方案2:使用Fluent API集中配置关系
在你的自定义DbContext类的OnModelCreating方法中添加关系配置,这种方式更适合多实体关系的统一管理:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 必须保留这行,否则Identity相关的默认配置会丢失 base.OnModelCreating(modelBuilder); // 配置Category和ApplicationUser的外键关联 modelBuilder.Entity<Category>() .HasOne(c => c.ApplicationUser) .WithMany(u => u.Categories) .HasForeignKey(c => c.UserId); }
后续操作
修改完成后,删除之前生成的包含多余ApplicationUserId列的迁移记录,重新执行Add-Migration和Update-Database命令更新数据库即可。
内容的提问来源于stack exchange,提问作者Voli
相关产品推荐
相关产品推荐

