如何在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);
如果两边都映射呢?我认为这应该有效:
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关系