【问题标题】:One to One Relationship With Same Entity Type - FluentAPI具有相同实体类型的一对一关系 - FluentAPI
【发布时间】:2020-03-21 07:09:50
【问题描述】:

只是有点担心如何为与同一实体的一对一关系配置 EF,这对我来说很少见。我遇到了这个要求,我对如何建模有点怀疑。

这是场景,

一位患者可以有一个伴侣,而一位伴侣只能属于一位患者。伴侣也是患者。

我的模型是这样的;

 public class Patient
 {
    public long Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public EGender Gender { get; set; }

    public DateTime DateOfBirth { get; set; }

    public DateTime CreatedAt { get; set; }

    public long PartnerId { get; set; }

    public Patient Partner { get; set; }

    public EPatientType PatientType { get; set; }
 }

我的 FluentAPI 配置是这样的,但不确定我做对了

      builder.HasOne(p => p.Partner)
            .WithOne(p => p.Partner) // Not sure what to do here
            .IsRequired(false)
            .HasForeignKey<Patient>(p => p.PartnerId)
            .OnDelete(DeleteBehavior.Restrict);

感谢任何关于如何在 fluentAPI 上建模或如何进行的想法...

【问题讨论】:

  • 只要OwnsOne 没有参数就足够了。这是Ef核心还是完整版?
  • 这是 EF Core。
  • @Mat ...你是说我会做 builder.OwnsOne(x =>x.Partner) ??
  • 抱歉,我的意思是,builder.OwnsOne(p =&gt; p.Partner).HasOne() 可能会起作用。当我们没有一端的导航属性时,我们只是配置它而不指定属性。但不确定一对一是否适用于同一张桌子,因为一对一意味着孩子也将具有与父母相同的 id。不知道它在 Ef 核心中的表现如何。
  • @Mat ...我认为 HasOne() 也需要一个参数...这不能为空。但同样,这归结为我来自哪里......即如何正确建模。

标签: c# entity-framework ef-fluent-api


【解决方案1】:

[索引("IX_UniqueParentId", 1, IsUnique = true)]

public long? PartnerId { get; set; }

【讨论】:

  • 这个问题的答案如何?
  • 我认为 PartnerId 可以为空,为此需要将其设为空,如果在此属性中添加索引可以使其唯一
  • 是的...我知道 partnerId 应该接受空值。问题是建立一对一的关系船。我不知道我发表评论的地方是对还是错。在关系的反面,即 withOne() ......我如何用同一个实体处理它。因为通常...如果它与两个不同的实体是一对一的,我必须引用另一个实体。
【解决方案2】:

尝试使用:

builder.HasOne(p => p.Partner)
       .WithOne()
       .IsRequired(false)
       .HasForeignKey<Patient>(p => p.PartnerId);

它对我有用。

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多