Asp Ядро - Древовидная структура - отображение - PullRequest
0 голосов
/ 25 мая 2020

Я создаю древовидную структуру, в которой есть Узлы и Листья. Каждый узел имеет подузлы и подлисты.

Вот структура сущностей:

Узел:

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 не так.

1 Ответ

0 голосов
/ 25 мая 2020

Хорошо, я забыл добавить Include, чтобы получить список методов Nodes. И метод маппера ForMember не нужен.

var nodes = await _context.Nodes.Include(x => x.SubLeaves).ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...