Свойство не является навигационным свойством типа сущности

Я разработал свои сущности, прикрепленные на диаграмме ниже. введите здесь описание изображения

Для этой схемы я бы написал следующий запрос в sql, чтобы получить все роли, действия, приложения для этого пользователя следующим образом.

select * from users u, roles r, userroles ur, roleappactivities raa, applications ap, activities ac
where u.Id = ur.UserId
and ur.RoleId = r.Id
and r.Id = raa.RoleId
and raa.ApplicationId = ap.Id
and raa.ActivityId = ac.Id
and u.id = 1

Чтобы то же самое было достигнуто в моем основном приложении, я написал следующий код, который не работает. У меня закончились идеи о том, как выполнить вышеуказанный запрос с помощью следующего кода. Любая помощь высоко ценится.

_context.Users
                .Include("Roles")
                .Include("RoleAppActivities")
                .Include("Applications")
                .Include("Activities")
                .Where(x => x.Id == id)
                .Select(x => new User
                {
                    Id = x.Id,
                    TId = x.TId,
                    Roles = x.Roles

                })

Редактировать:

Вот мои сущности

 public class User
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }        
        public ICollection<UserRole> Roles { get; set; }
    }

открытый класс UserRole {

    public int UserId { get; set; }
    public User User{ get; set; }

    public int RoleId { get; set; }
    public Role Role{get; set;}
}
 public class Role
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public ICollection<UserRole> Users { get; set; }
        public ICollection<RoleApplicationActivity> RoleApplicationActivity { get; set; }
    }

 public class RoleApplicationActivity
    {

        public int Id { get; set; }
        public int RoleId { get; set; }
        public int ApplicationId { get; set; }
        public int ActivityId { get; set; }

        public Activity Activity { get; set; }
        public Application Application { get; set; }
        public Role Role { get; set; }
    }

public class Activity
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<RoleApplicationActivity> RoleApplicationActivity { get; set; }
    }


 public class Application
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public ICollection<RoleApplicationActivity> RoleApplicationActivity { get; set; }

    }

person coolcake    schedule 28.12.2017    source источник
comment
Похоже, вы не настроили свойства навигации для сущности пользователя. Не могли бы вы поделиться сущностями?   -  person lucky    schedule 28.12.2017
comment
Как это сделать, хорошо задокументировано: docs.microsoft. com/en-us/ef/core/querying/related-data   -  person Gert Arnold    schedule 29.12.2017


Ответы (2)


Я думаю, что у вашего объекта User должны быть другие коллекции (Roles , RoleAppActivities..). Таким образом, вы можете напрямую загрузить их, используя .include(user=> user.Collection) , я думаю, что это более строго типизировано, чем использование .include("string)"..

person Khalil Lazhar    schedule 28.12.2017

Я должен изменить свой запрос на следующий, чтобы решить проблему.

from u in _context.Users
                   from r in _context.Roles
                   from app in _context.Applications
                   from ac in _context.Activities
                   where u.Id == 1
                   select u
person coolcake    schedule 28.12.2017