【问题标题】: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。这是正常行为吗?有谁知道为什么会这样?
【问题讨论】:
标签:
database
entity-framework
asp.net-core
ef-fluent-api
【解决方案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 列上设置唯一约束,但如果没有,您应该添加一个以在数据级别强制执行它。