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



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

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

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

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

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

例如,您可以添加"在您的ApprovedAppointment表中,或在"ApprovedAppointment"表中添加"ApprovedAppointment"。然后相应地映射ForeignKey:

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

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

这将允许Appointment具有5的Appointment,而ApprovedAppointment的ApprovedAppointment是1或2,但包含一个5的Appointment FK以引用回Appointment。

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