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

时间:2019-01-18 12:09:30

标签: c# foreign-keys entity-framework-core composite-primary-key ef-core-2.0

我在EF Core 2中有几门课。 1)类Ser

  • 具有id作为Guid类型。这是一个主键,会自动递增。

2)类SerStaHis

  • 具有SerId作为Guid类型。这是Class Ser的外键。这是带有时间戳的主键

  • 具有时间戳。这是SerId的主键

我使用EF Core 2构建上面的两个表。我已经使用了Composite Key功能来组合SerStaHis.timestamp和SerStaHis.SerId作为主键。

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

以下是有关Ser类,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时获得的实际结果: actual result

我在SQL中的预期结果如下:expected result

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

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

更改

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

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

ForeignKey属性应用于FK属性,参考导航属性和集合导航属性时,其工作原理有所不同。当应用于集合导航属性时,它指定 related 对象的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