Я создаю древовидную структуру, в которой есть Узлы и Листья. Каждый узел имеет подузлы и подлисты.
Вот структура сущностей:
Узел:
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace TreeWithReact.Entities
{
public class Node
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int NodeId { get; private set; }
public string Name { get; set; }
public int? ParentNodeId { get; set; }
[ForeignKey("ParentNodeId")]
public Node ParentNode { get; set; }
public List<Node> SubNodes { get; set; }
public List<Leaf> SubLeaves { get; set; }
public Node()
{
SubNodes = new List<Node>();
SubLeaves = new List<Leaf>();
}
}
}
Лист:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;
namespace TreeWithReact.Entities
{
public class Leaf
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int LeafId { get; set; }
public string Name { get; set; }
public int? ParentNodeId { get; set; }
[ForeignKey("ParentNodeId")]
public Node ParentNode { get; set; }
}
}
и отношения :
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Node>()
.HasMany(cat => cat.SubNodes)
.WithOne(cat => cat.ParentNode);
modelBuilder.Entity<Node>()
.HasMany(cat => cat.SubLeaves)
.WithOne(cat => cat.ParentNode);
}
Вот метод, отвечающий за получение всего дерева:
public async Task<IEnumerable<NodeModel>> GetTreeAsync()
{
var nodes = await _context.Nodes.ToListAsync();
return _mapper.Map<IEnumerable<NodeModel>>(nodes);
}
Узлы сопоставлены с NodeModel:
public class NodeModel
{
public string Name { get; set; }
public List<NodeModel> SubNodes { get; set; }
public List<LeafModel> SubLeaves { get; set; }
}
}
А вот Конфигурация AutoMapper:
CreateMap<Node, NodeModel>()
.ForMember(dest => dest.SubLeaves, opt => opt.MapFrom<IEnumerable<Leaf>>(src => src.SubLeaves));
Но в результате я получаю пустой массив SubLeaves, SubNodes отображаются правильно. Я не знаю, может что-то в onModelCreating не так.