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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:33:31