如何在EF6中创建可选的1:1关系,并在两侧使用相同的实体类型?

时间:2015-07-01 17:42:50

标签: c# entity-framework entity-framework-6

我希望我的甜甜圈可以选择与另一个甜甜圈相关,如果是这样的话,另一个甜甜圈会回复。从我读过的内容来看,我认为我需要将其设置为父/子关系,即使在现实世界中,它只是一个可选的配对(甜甜圈可以自己存在,也可以成对存在)。这是我目前的设置:

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);

1 个答案:

答案 0 :(得分: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 relationship in Entity Framework