如何在 EF Core 2 中使用外键作为复合键?

How to use foreign key as composite key in EF Core 2?

我在 EF Core 2 中有几个 类。 1) Class Ser

2) Class SerStaHis

我使用 EF Core 2 在上面构建了两个表。我使用复合键功能将 SerStaHis.timestamp 和 SerStaHis.SerId 组合为主键。

我也在Class Ser中使用了ForeignKey属性。 问题是我已经设法将外键映射到 Class SerStaHis,但我无法将该外键与 SerStaHis.timestamp 组合为主键。

这里是 Class Ser、Class SerStaHis 和 OnModelCreating 方法的代码片段。

public class Ser {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]   // auto-incrementing feature
    public Guid id { get; set; }

    //nav/foreign keys
    [ForeignKey("id")]
    public virtual ICollection<SerStaHis> SerStaHis{ get; set; }
}

public class SerStaHis{
    [Required] // maybe this is wrong as I got a foreign key from Class Ser
    public Guid service_id { get; set; }
    [Required]
    public DateTime timestamp { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);

        // composite primary keys method. // https://docs.microsoft.com/en-us/ef/core/modeling/keys
        modelBuilder.Entity<SerStaHis>()
            .HasKey(c => new {c.service_id, c.timestamp});
    }

这是我迁移到SQL时得到的实际结果:
(来源:pbrd.co

我在SQL中的预期结果如下:
(来源:pbrd.co

如果您需要更多说明,请告诉我。

我可以用 FluentAPI 方法完成上述任务吗?

如何使用外键作为复合主键?

谢谢

改变

[ForeignKey("id")]
public virtual ICollection<SerStaHis> SerStaHis{ get; set; }

[ForeignKey("service_id")]
public virtual ICollection<SerStaHis> SerStaHis{ get; set; }

ForeignKey 属性在应用于 FK 属性、参考导航 属性 和 collection 导航 属性 时的工作方式不同。当应用于 collection 导航 属性 时,它指定 相关 object.

的 FK 属性 名称

我个人认为 ForeignKey 属性令人困惑且容易出错。 Fluent API 更直观并且提供更好的控制。您的场景的流畅配置是这样的:

modelBuilder.Entity<Ser>()
    .HasMany(ser => ser.SerStaHis) // collection navigation property
    .WithOne() // no reference navigation property
    .HasForeignKey(serStaHis => serStaHis.service_id); // foreign key property