在Entity Framework 7中创建自我引用多对多关系

时间:2016-06-06 09:09:19

标签: c# entity-framework asp.net-core entity-framework-core

我尝试使用Entity Framework 7流畅的API设置我的数据库,以添加自引用的多对多关系。 有问题的课程如下:

public class Definition
{
    // Some properties
    public virtual ICollection<Definition> AllowedChildDefinitions { get; set; }
}

其中预期的关系是每个定义可以具有任意数量的子节点。我希望有一个单独的表,其中包含父/子列,每个父项可以有多个子项,每个子项可以在多个父项上。

有多对多的示例和自引用表的示例,但我不知道如何将两者结合起来。

2 个答案:

答案 0 :(得分:0)

解决方法是将连接表映射到实体。请仔细研究。

public class Definition
{
   public int Id { get; set; }
   public ICollection<ChildrenDefinition> ChildrenDefinitions{ get; set; }
}

public class ChildrenDefinition
{
  public int DefinitionId { get; set; }
  public Definition Definition { get; set; }

  public int ChildrenId { get; set; }
  public Children Children { get; set; }
}

public class Children
{
    public int Id { get; set; }
    public ICollection<ChildrenDefinition> ChildrenDefinitions{ get; set; }
}

确保使用复合键配置ChildrenDefinition:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   modelBuilder.Entity<ChildrenDefinition>().HasKey(x => new {  x.DefinitionId, x.ChildrenId });
}

要导航,请使用选择:

// Children.Definition
var definitions = Children.ChildrenDefinitions.Select(c => c.Definition);

希望这可以帮助你!

答案 1 :(得分:-1)

比如说,你有以下两个类。

1.  Definition 
2.  Children

对于多对多关系,您必须将ICollection父类放在子类中,并将子类的ICollection放在父类中,如下所示。

public class Definition
 {
  // Some properties
  public virtual ICollection<Children> Childrens { get; set; }
 }

另一个Class(Children)应该有ICollection of Definition类。

  public class Children
  {
   // Some properties
   public virtual ICollection<Definition> Definitions { get; set; }
  }

在DataContext中,您应该为新表创建映射,如下所示,

 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {

   modelBuilder.Entity<Definition>()
             .HasMany(l => l.Childrens)
             .WithMany(o => o.Definitions)
             .Map(m =>
             {
                 m.MapLeftKey("DefinitionId");
                 m.MapRightKey("ChildrenId");
                 m.ToTable("ChildrenDefinitions");
             });
  }

注意:您将使用2列创建单独的表(DefinitionId,ChildrenId)。此表(ChildrenDefinitions)将使您能够创建与定义类和子类的多对多关系。

希望这可以帮助你!