我如何建立这种EF关系?
本文关键字:EF 关系 建立 何建立 | 更新日期: 2023-09-27 18:09:48
我可以在数据库中这样做,但我想先了解如何做这个代码。
我有这样一个类:
public class Component
{
public Guid ID { get; set; }
public Guid Name { get; set; }
public virtual Component Master { get; set; }
public virtual ICollection<Component> Components { get; set; }
}
一个组件可以有很多子组件。一个组件也可以是许多其他组件中的子组件。
我想创建一个表,将组件的ID联系在一起。最好的表示方式是什么?
当你有一个像这样的自引用实体,只能有一个父元素:
public class Component
{
public Guid ID { get; set; }
public Guid Name { get; set; }
public virtual Component Master { get; set; }
public virtual ICollection<Component> Components { get; set; }
// reference to the parent guid (if any)
public Guid? MasterID { get; set; }
}
要配置实体关系,请在OnModelCreating中这样做:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Component>()
.HasMany(c => c.Components)
.WithOptional(c => c.Master)
.HasForeignKey(fk => fk.MasterID);
}
另一种选择是设置一个xref/join表,而不是将其作为Components表上的一列,但在这种情况下,您有一个多对多关系,因此不是单个组件主,而是一个组件集合作为主。您可以使用惟一的键来强制它只能是一个父节点,但是您仍然必须从EF的角度将其建模为一个集合。
下面是一个使用Xref表的例子:public class Component
{
public Guid ID { get; set; }
public Guid Name { get; set; }
public virtual ICollection<Component> Masters { get; set; }
public virtual ICollection<Component> Components { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Component>()
.HasMany(c => c.Components)
.WithMany(c => c.Masters)
.Map(xref => xref.MapLeftKey("ParentID").MapRightKey("ChildID").ToTable("ComponentXref"));
}