【问题标题】: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 列上设置唯一约束,但如果没有,您应该添加一个以在数据级别强制执行它。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2017-06-27
      • 2015-05-04
      • 2016-01-27
      相关资源
      最近更新 更多