我在EF Core 2中有几门课。 1)类Ser
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时获得的实际结果:
我在SQL中的预期结果如下:
如果需要更多说明,请告诉我。
我可以用FluentAPI方法完成上述任务吗?
如何使用外键作为复合主键?
谢谢
答案 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