EF Include и ThenInclude - PullRequest
       1

EF Include и ThenInclude

0 голосов
/ 29 января 2020

У меня есть несколько моделей, которые я пытаюсь связать с помощью Include, который не возвращает все ожидаемые связанные данные. Полная цепочка:

Пользователь (один)> Роль (один)> Права (Много)> Entity (Один)> EntityArea (Один)

Это мои модели: (CompanyBase является базовый класс с указанием CompanyId)

public class User : _CompanyBase
    {
        public int UserID { get; set; }
        public string FullName { get; set; }

        public int RoleID { get; set; }
        public Role Role { get; set; }
    }


 public class Role : _CompanyBase
    {
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int RoleID { get; set; }

        [Required]
        [StringLength(100, MinimumLength = 3)]
        public string Name { get; set; }

        public ICollection<RolePermission> RolePermissions { get; set; }

        public ICollection<User> Users { get; set; }
    }


 public class RolePermission : _CompanyBase
    {
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int RolePermissionID { get; set; }
        public Guid Id { get; set; }

        [Required]
        [StringLength(100, MinimumLength = 3)]
        public string PermissionCode { get; set; }



        public int RoleID { get; set; }
        public Role Role { get; set; }



        public int EntityID { get; set; }
        public Entity Entity { get; set; }


    }

public class Entity : _CompanyBase
    {
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EntityID { get; set; }

        [Required]
        [StringLength(100, MinimumLength = 3)]
        public string DisplayName { get; set; }


        public int EntityAreaID { get; set; }

        public EntityArea EntityArea { get; set; }


    }

public class EntityArea :_CompanyBase
    {
        [Key, Column(Order = 1), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int EntityAreaID { get; set; }

        [Required]
        [StringLength(50, MinimumLength = 3)]
        public string Name { get; set; }


        public ICollection<Entity> Entities { get; set; }
    }

И я пытаюсь связать их с:

dbUser = db.Users
                    .AsNoTracking()
                    .Where(x => x.UserId == UserID)
                    .Include(m => m.Role)
                    .ThenInclude(m => m.RolePermissions)
                    .ThenInclude(m => m.Entity)
                    .ThenInclude(m => m.EntityArea)
                    .FirstOrDefault();

Однако, я получаю роль, я ничего больше не получаю (Сбор ролевых разрешений, сущность и область). Что-то принципиально я делаю не так? Это запрос только для чтения, поэтому, следовательно, используется notracking.

Спасибо!

1 Ответ

0 голосов
/ 29 января 2020

Не думаю, что в вашей попытке что-то в корне не так. Вы проверяли, есть ли у указанного пользователя c какие-либо данные в связанных таблицах?

Include () может иногда генерировать левое соединение, когда оно вам действительно не нужно, поэтому я бы посоветовал вам держись подальше от этого, когда сможешь. Я бы обычно использовал прогноз, чтобы указать данные, которые я хочу получить. Для вашего примера это можно сделать с помощью:

    dbUser = db.Users
                        .AsNoTracking()
                        .Where(x => x.UserId == UserID)
                        .Select(x => new 
                        {
                          Role = x.Role,
                          RolePermissions = x.RolePermissions,
                          Entity = x.Entity,
                          EntityArea = x.EntityArea
                        })
                        .FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...