根据惯例进行一对多映射

在最后一个示例中,你可以看到 EF 确定哪个列是外键,以及它应指向哪个列。怎么样?通过使用约定。具有 Person 类型的属性,其名称为 Person,具有 PersonId 属性,导致 EF 得出 PersonId 是外键的结论,并且它指向由 Person 类型表示的表的主键。

但是,如果你要改变 PERSONIDOWNERID业主类型?

public class Car
{
   public int CarId { get; set; }
   public string LicensePlate { get; set; }
   public int OwnerId { get; set; }
   public virtual Person Owner { get; set; }
}

好吧,不幸的是,在这种情况下,约定不足以生成正确的数据库模式:

别担心; 你可以帮助 EF 提供有关你的关系和模型中的键的一些提示。只需配置 Car 类型即可将 OwnerId 属性用作 FK。创建实体类型配置并将其应用于 OnModelCreating()

public class CarEntityTypeConfiguration : EntityTypeConfiguration<Car>
{
  public `CarEntityTypeConfiguration()`
  {
     this.HasRequired(c => c.Owner).WithMany(p => p.Cars).HasForeignKey(c => c.OwnerId);
  }
}

这基本上说 Car 有一个必需的属性 OwnerHasRequired() ),在 Owner 的类型中,Cars 属性用于引用汽车实体( WithMany() )。最后指定了表示外键的属性( HasForeignKey() )。这为我们提供了我们想要的架构:

你也可以从 Person 侧配置关系:

public class PersonEntityTypeConfiguration : EntityTypeConfiguration<Person>
{
  public `PersonEntityTypeConfiguration()`
  {
    this.HasMany(p => p.Cars).WithRequired(c => c.Owner).HasForeignKey(c => c.OwnerId);
  }
}

这个想法是一样的,只是两边是不同的(注意你如何阅读整个事情:‘这个人有很多车,每辆车都有一个必需的车主’)。如果你配置 Person 侧或 Car 侧的关系无关紧要。你甚至可以包括两者,但在这种情况下要注意在两边指定相同的关系!