EF Core запрос полного соединения между многими ко многим - PullRequest
0 голосов
/ 12 января 2020

Я работаю с ядром EF и имею отношение «многие ко многим» между СТУДЕНТАМИ и СУБЪЕКТАМИ, например:

public class StudentDetail
    {
        [Key]
        [JsonPropertyName("Id")]
        public int Id { get; set; }
        [Required]
        [Column(TypeName ="nvarchar(50)")]
        [JsonPropertyName("Name")]
        public string Name { get; set; }
        [JsonPropertyName("StudentSubjects")]
        public virtual IEnumerable<StudentSubject> StudentSubjects {get; set;}
    }

 public class SubjectDetail
    {

        [Key]
        [JsonPropertyName("Id")]
        public int Id { get; set; }
        [Required]
        [Column(TypeName = "nvarchar(20)")]
        [JsonPropertyName("SubjectName")]
        public string SubjectName { get; set; }
        [Required]
        [JsonPropertyName("Teacher")]
        public virtual TeacherDetail Teacher { get; set; }
        [JsonPropertyName("StudentSubjects")]
        public IEnumerable<StudentSubject> StudentSubjects { get; set; }
    }

public class StudentSubject
    {

        [JsonPropertyName("StudentId")]
        public int StudentId { get; set; }

        [JsonPropertyName("Student")]
        public StudentDetail Student { get; set; }

        [JsonPropertyName("SubjectId")]
        public int SubjectId { get; set; }

        [JsonPropertyName("Subject")]
        public SubjectDetail Subject { get; set; }
        [Required]
        [Column(TypeName = "nvarchar(3)")]
        [JsonPropertyName("Grade")]
        public string Grade { get; set; }
    }

Я создаю свою базу данных с использованием миграций, поэтому после миграции , база данных была создана так:

enter image description here enter image description here enter image description here

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

var subjects = await _context.StudentSubject
                               .Include(s => s.Subject)
                               .Where(sid => sid.StudentId == student.Id)
                               .Select(st => st.Subject)
                               .Include(t => t.Teacher)
                               .ToListAsync();

Но я получаю ОШИБКУ, говорящую, что я пытаюсь использовать Include(); на незапрашиваемом объекте. Кто-нибудь знает, что я делаю не так?

1 Ответ

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

Включить будет работать только в том случае, если у вас есть связь между двумя таблицами, которая определяется ключевым словом Virtual в C# классах. Пожалуйста, используйте publi c virtual ICollection вместо publi c IEnumerable и перейдите по ссылке для получения более подробной информации. Если вы все еще хотите продолжить работу с тем же классом, попробуйте использовать объединение в запросах Linq.

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