我希望我的甜甜圈可以选择与另一个甜甜圈相关,如果是这样,另一个甜甜圈可以与另一个甜甜圈相关。从我的阅读中,我相信我需要将其设置为父子关系,即使在现实世界中,这只是一个可选的配对(甜甜圈可以快乐地独立存在,也可以成对存在)。这是我当前的设置:
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);
最佳答案
如果您同时绘制双方的地图怎么办?我认为这应该工作:
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