繁体   English   中英

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

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

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

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

2) 类 SerStaHis

  • 将 SerId 作为 Guid 类型。 它是 Ser 类的外键。 它是带时间戳的主键

  • 有时间戳。 它是带有 SerId 的主键

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

我也在类 Ser 中使用 ForeignKey 属性。 问题是我已经设法将外键映射到 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; }

应用于 FK 属性、引用导航属性和集合导航属性时, ForeignKey属性的工作方式有所不同。 当应用于集合导航属性时,它指定相关对象的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM