如何在 EF Core 2 中使用外键作为复合键?
How to use foreign key as composite key in EF Core 2?
我在 EF Core 2 中有几个 类。
1) Class Ser
- 具有 Guid 类型的 id。它是一个主键,自动递增。
2) Class SerStaHis
有 SerId 作为 Guid 类型。它是 Class Ser 的外键。它是一个带有时间戳
的主键
有时间戳。它是一个带有 SerId
的主键
我使用 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
我在 EF Core 2 中有几个 类。 1) Class Ser
- 具有 Guid 类型的 id。它是一个主键,自动递增。
2) Class SerStaHis
有 SerId 作为 Guid 类型。它是 Class Ser 的外键。它是一个带有时间戳
的主键
有时间戳。它是一个带有 SerId
的主键
我使用 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.
我个人认为 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