[英]How to use foreign key as composite key in EF Core 2?
我在 EF Core 2 中有几个类。1) Class Ser
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.