使用实体框架的一对一关系

Posted

技术标签:

【中文标题】使用实体框架的一对一关系【英文标题】:One to one relation using entity framework 【发布时间】:2021-12-10 18:07:02 【问题描述】:

我正在做一个小组项目,其中实体框架中的一对一关系是这样定义的

builder.Entity<ApprovedAppointment>()
            .HasOne(aa => aa.Appointment)
            .WithOne(a => a.ApprovedAppointment)
            .HasForeignKey<ApprovedAppointment>(a => a.ApprovedAppointmentId);

使用流畅的 api。在数据库中,约会主键与approvedAppointment 主键相同。例如,如果 AppointmentId 5 是第一个被接受的约会,那么即使还没有插入其他approvedAppointments,approvedAppointmentId 也是5。这是正常行为吗?有谁知道为什么会这样?

【问题讨论】:

【参考方案1】:

是的,这是默认映射行为,因为您将 FK 指向表的 PK。您可以在该配置中完全删除 .HasForeignKey()

HasForeignkey() 在 EF Core 中可用,允许您在任一表中指定配置的一对一关系键以指向另一个表的 PK。

例如,您可以在 ApprovedAppointment 表中放置一个“AppointmentId”,或者在 ApprovedAppointment 表中放置一个“ApprovedAppointmentId”,然后相应地映射 ForeignKey:

.HasForeignKey<ApprovedAppointment>(aa => aa.AppointmentId);

.HasForeignKey<Appointment>(a => a.ApprovedAppointmentId);

分别。

这将允许 Appointment 的 AppointmentId 为 5,而 ApprovedAppointment 的 ApprovedAppointmentId 为 1 或 2,但包含 5 的 AppointmentId FK 以引用回 Appointment。

通常在一对一关系中,两个表将共享相同的 PK 以确保关系是一对一的。指定备用 FK 后,您将映射 EF 将强制执行为 1 对 1 的一对多或多对一关系。我不确定 EF Code First 是否会在 FK 列上设置唯一约束,但如果没有,您应该添加一个以在数据级别强制执行它。

【讨论】:

以上是关于使用实体框架的一对一关系的主要内容,如果未能解决你的问题,请参考以下文章

实体框架一对一关系

在实体框架 6 中不起作用的实体之间的一对一关系

实体框架代码优先关系 - 如何定义两个对象之间的关系:两个实体之间的可选一对一

实体框架可选的一对一关系不起作用

实体框架使用流畅的API继承了一对一到一个关系配置

用于一对一识别关系的实体框架代码优先流利 API 配置