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