如何在EF核心中设置主键的外键

时间:2019-11-13 10:52:49

标签: .net-core entity-framework-core

让我们想象我有一个实体 Car ,我正在建立一个表来替换没有车的汽车,让我们称之为 CarSwap 的女巫只是一个表有2列,一列带有我们拥有的CarId,另一列取代了我们的CarId。

Class CarSwap{
  public int CarId { get; set; }
  public int ReplacerId { get; set; }
  public Car Car { get; set; }
}

2辆车可能被同一辆车取代, 但一辆车只能换一辆车

所以我认为代表这个的代码是:

public void Configure(EntityTypeBuilder<CarSwap> builder)
{
   builder.HasKey(c => new { c.CarId }); // Key because one car can only be replaced by one car
   builder.Property(c => c.CarId ).ValueGeneratedNever();

   builder.HasOne(e => e.Car).WithOne().HasForeignKey(typeof(CarSwap), "CarId").IsRequired();
   builder.HasOne(e => e.Car).WithMany().HasForeignKey(a => a.ReplacerId).IsRequired(); // Because the replacer can replace multiple cars
}

生成迁移时,此代码为ReplacerId而不是CarId创建正确的外键。

如何使它生成正确的外键,以使其不允许我添加不存在的汽车?

1 个答案:

答案 0 :(得分:0)

现在我已经意识到自己的愚蠢错误。我没有图要更换的汽车。 我已通过将其更改为以下方式对其进行了修复:

Class CarSwap{
  public int CarId { get; set; }
  public int ReplacerId { get; set; }
  public Car Car { get; set; }
  public Car Replacer { get; set; }
}

然后更改:

builder.HasOne(e => e.Car).WithMany().HasForeignKey(a => a.ReplacerId).IsRequired(); // Because the replacer can replace multiple cars

收件人:

builder.HasOne(e => e.Replacer).WithMany().HasForeignKey(a => a.ReplacerId).IsRequired(); // Because the replacer can replace multiple cars