如何在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
相关产品推荐
相关产品推荐

