EF Core中如何将外键设为主键并指定自定义列名?
解决方案
方法一:使用数据注解
直接在Role类的UserId属性上同时标记主键和外键特性,补充必要的导航属性即可:
public class User { [Key] public int Id { get; set; } [Required] public string FirstName { get; set; } [Required] public string LastName { get; set; } [Required] [EmailAddress] public string Email { get; set; } [Required] public string Password { get; set; } // 初始化集合避免空引用,配置与Role的一对多关系 public ICollection<Role> Roles { get; set; } = new List<Role>(); } public class Role { // 同时标记为主键和外键,指定关联的User实体 [Key] [ForeignKey(nameof(User))] public int UserId { get; set; } [Required] public string Name { get; set; } // 导航属性,指向所属的User实体 public User User { get; set; } }
方法二:使用Fluent API(推荐)
如果数据注解方式不生效,可在DbContext的OnModelCreating方法中明确配置关系,这种方式更灵活直观:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 配置Role的主键为UserId modelBuilder.Entity<Role>() .HasKey(r => r.UserId); // 配置Role与User的一对多关联: // 一个User对应多个Role,Role的UserId作为外键关联User的Id modelBuilder.Entity<Role>() .HasOne<User>() .WithMany(u => u.Roles) .HasForeignKey(r => r.UserId) .IsRequired(); // 匹配[Required]特性,确保外键非空 }
对应实体类可简化为:
public class User { [Key] public int Id { get; set; } [Required] public string FirstName { get; set; } [Required] public string LastName { get; set; } [Required] [EmailAddress] public string Email { get; set; } [Required] public string Password { get; set; } public ICollection<Role> Roles { get; set; } = new List<Role>(); } public class Role { public int UserId { get; set; } [Required] public string Name { get; set; } public User User { get; set; } }
关键说明
两种方式都能实现需求:让UserId同时作为Role的主键和指向User.Id的外键,且数据库列名保持为UserId。之前尝试失败大概率是缺少导航属性或Fluent API配置写法有误,按上述代码调整即可。
内容的提问来源于stack exchange,提问作者user18003912
相关产品推荐
相关产品推荐

