一对一映射

一对一映射(当需要双方时)也是一件棘手的事情。

让我们想象一下如何使用外键来表示它。同样,在 People 中的 CarId 指的是 Car 中的 CarId,而在 car 中的 PersonId 指的是 People 中的 PersonId

现在如果要插入汽车记录会发生什么?为了使此成功,必须在此车记录中指定 PersonId,因为它是必需的。并且为了使这个 PersonId 有效,必须存在 People 中的相应记录。好的,让我们继续并插入人员记录。但为了成功,一个有效的 CarId 必须在人的记录中 - 但那辆车还没有插入! 它不可能,因为我们必须首先插入推荐人员记录。但是我们不能插入引用的人员记录,因为它引用了汽车记录,所以必须先插入(外键 - 密码:))。

因此,这也不能代表逻辑方式。同样,你必须删除其中一个外键。你放弃哪一个取决于你。留有外键的一方称为依赖,没有外键的一方称为委托。同样,为了确保依赖项的唯一性,PK 必须是 FK,因此不支持添加 FK 列并将其导入模型。

所以这是配置:

public class CarEntityTypeConfiguration : EntityTypeConfiguration<Car>
{
  public CarEntityTypeConfiguration()
  {
    this.HasRequired(c => c.Person).WithRequiredDependent(p => p.Car);
    this.HasKey(c => c.PersonId);
  }
}

到现在为止你真的应该已经掌握了它的逻辑:)只要记住你也可以选择另一方,只需要小心使用 WithRequired 的 Dependent / Principal 版本(你仍然需要在 Car 中配置 PK)。

public class PersonEntityTypeConfiguration : EntityTypeConfiguration<Person>
{
  public PersonEntityTypeConfiguration()
  {
    this.HasRequired(p => p.Car).WithRequiredPrincipal(c => c.Person);
  }
}

如果检查数据库模式,你会发现它与一对一或零解决方案的情况完全相同。那是因为这不是由架构强制执行的,而是由 EF 本身强制执行的。所以再次,小心:)