我尝试使用Entity Framework 7流畅的API设置我的数据库,以添加自引用的多对多关系。 有问题的课程如下:
public class Definition
{
// Some properties
public virtual ICollection<Definition> AllowedChildDefinitions { get; set; }
}
其中预期的关系是每个定义可以具有任意数量的子节点。我希望有一个单独的表,其中包含父/子列,每个父项可以有多个子项,每个子项可以在多个父项上。
有多对多的示例和自引用表的示例,但我不知道如何将两者结合起来。
答案 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)将使您能够创建与定义类和子类的多对多关系。
希望这可以帮助你!