如何在EF6中建立双方实体类型相同的可选1:1关系

本文关键字:类型 关系 实体 EF6 建立 方实体 | 更新日期: 2023-09-27 18:00:37

我希望我的甜甜圈可以选择性地与另一个甜甜圈关联,如果是这样,另一个会关联回来。从我所读到的内容来看,我相信我需要将其建立为父母/孩子的关系,尽管在现实世界中,这只是一对可选的伴侣(甜甜圈可以快乐地独自存在,也可以成对存在)。这是我目前的设置:

public class Donut {
    public int Id { get; set; }
    public int? ParentDonutId { get; set; }
    public int? ChildDonutId { get; set; }
    // virtual properties
    public virtual Donut ParentDonut { get; set; }
    public virtual Donut ChildDonut { get; set; }
}

映射文件中的这句话让我很接近,但坚持在表上创建一个名为ParentDonut_Id的新键,而不是使用现有的ParentDonutId:

this.HasOptional(t => t.ChildDonut)
            .WithOptionalPrincipal(t => t.ParentDonut);

但当我尝试这种映射时:

this.HasOptional(t => t.ChildDonut)
            .WithOptionalPrincipal(t => t.ParentDonut)
            .Map(m => m.MapKey("ParentDonutId")); // or "ChildDonutId"

尝试Add-Migration:时收到此错误消息

ParentDonutId: Name: Each property name in a type must be unique. Property name 'ParentDonutId' is already defined.

我应该如何建立这种关系?有可能吗?对我来说,这似乎很合乎逻辑,但也许这是DB不让你做的事情之一?

编辑:我遇到了这个黑客,它可能会让我做我需要的事情,但它不允许从孩子向后导航到父母甜甜圈,这将是一个很好的选择:

this.HasOptional(t => t.ChildDonut)
            .WithMany() // haxx
            .HasForeignKey(t => t.ChildDonutId);

如何在EF6中建立双方实体类型相同的可选1:1关系

如果两边都映射呢?我认为这应该有效:

 modelBuilder.Entity<Donut>()
        .HasOptional(e => e.ChildDonut)
        .WithMany()
        .HasForeignKey(t => t.ChildDonutId);
 modelBuilder.Entity<Donut>()
        .HasOptional(e => e.ParentDonut)
        .WithMany()
        .WithMany(t => t.ParentDonutId);

要了解更多关于自引用的信息,请查看实体框架中的Second self-To-self关系