我如何建立这种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联系在一起。最好的表示方式是什么?

我如何建立这种EF关系?

当你有一个像这样的自引用实体,只能有一个父元素:

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