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

如何在Entity Framework Core中使用数据注解配置双主键?

解决EF Core中复合主键配置的问题

你的代码问题在于直接将导航属性User标记为主键,EF Core不支持把导航属性作为复合主键的一部分,复合主键必须使用对应关系的标量外键字段。下面是两种正确的配置方式:

方式一:使用数据注解

添加对应的外键字段UserId,将其设为复合主键的一部分,再关联导航属性:

public class OTP
{
    [Key, Column(Order = 0)]
    public int Id { get; set; }

    [Key, Column(Order = 1)]
    public int UserId { get; set; } // 作为复合主键的标量字段

    [ForeignKey("UserId")]
    public User User { get; set; } = null!;
}

方式二:使用Fluent API(推荐,配置更清晰)

在DbContext的OnModelCreating方法中显式配置复合主键和关系:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 配置OTP的复合主键
    modelBuilder.Entity<OTP>()
        .HasKey(otp => new { otp.Id, otp.UserId });

    // 配置与User的关联关系
    modelBuilder.Entity<OTP>()
        .HasOne(otp => otp.User)
        .WithMany() // 如果User实体包含OTP集合,替换为.WithMany(u => u.OTPs)
        .HasForeignKey(otp => otp.UserId);
}

关键说明

  • 主键必须映射到数据库的实际列,因此必须用标量属性(如int UserId),而非导航属性(User User)。
  • 若使用Fluent API,能更直观地管理实体关系和主键配置,尤其在复杂模型场景下更易维护。

内容的提问来源于stack exchange,提问作者pham vu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:30:37