在下面的示例中讨论了实施这种解决方案的困难和可能性。
一对一映射
一对一映射(当需要双方时)也是一件棘手的事情。
让我们想象一下如何用外键表示它。同样,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 版本(你仍然必须在汽车)。
public class PersonEntityTypeConfiguration : EntityTypeConfiguration<Person>
{
public PersonEntityTypeConfiguration()
{
this.HasRequired(p => p.Car).WithRequiredPrincipal(c => c.Person);
}
}
如果您检查数据库架构,您会发现它与一对一或零解决方案的情况完全相同。那是因为这不是由架构强制执行的,而是由 EF 本身强制执行的。再说一次,要小心:)