Многие ко многим в ядре EF

У меня есть следующие модели

public class Student
    {
       public int Id {get; set; }
       public string Name {get; set; }
       public ICollection<StudentToCourse> StudentToCourse {get; set; }
    }
    public class StudentToCourse
    {
       public int StudentId{get; set; }
       public Student Student {get; set; }
       public int CourseId{get; set; }
       public Course Course {get; set; }
    }
    public class Course
    {
       public int Id {get; set; }
       public string Name {get; set; }
       public ICollection<StudentToCourse> StudentToCourse {get; set; }
    }

Я хочу получить список всех КУРСОВ для каждого студенческого билета, как мне это сделать?


person Pacman    schedule 26.06.2019    source источник


Ответы (1)


Краткий ответ: ВЫБЕРИТЕ и сопоставьте значения идентификатора. Или программно -

foreach(Student s in yourstudentList)
{
    foreach(StudentToCourse stc in s.StudentToCourse)
    {
        if(stc.StudentId = s.Id)
            //this is one you want, do something with it
    }
}

Лучший ответ:

Сначала давайте посмотрим на вашу модель...

Представьте базовую структуру базы данных.

Ваша средняя таблица называется подстановкой.
На самом деле вам не нужен ни весь объект Student, ни весь объект Course в нем. Кроме того, вашему объекту Course не нужно знать ни о каком другом объекте.

Если вы можете представить себе три таблицы в своей базе данных, вы можете понять, как логически связать Студента с Курсом через три таблицы.

Ваша модель все еще неполная. В вашем приложении вам по-прежнему нужен контейнер, в данном случае это List courseIds. Таким образом, вашему студенту не нужно заботиться обо всех записях в таблице поиска студентов/курсов, а только о тех, которые применимы к конкретному студенту. И у вас есть легкодоступный объект для извлечения данных или отправки обновлений в базу данных.

При первоначальном заполнении коллекции courseIds вы должны выполнить SELECT FROM StudentToCourse where StudentId = x

Затем вы можете ПРИСОЕДИНИТЬСЯ к таблице курсов, чтобы получить такие значения, как название курса. Если вы обнаружите, что вам нужно выполнять много таких поисков, вы можете кэшировать свой список курсов и снизить трафик базы данных за счет некоторой оперативной памяти.

Каждый раз, когда вы создаете нового студента, вы хотите заполнить его список идентификаторов курса, а при фиксации студента в базе данных вы сохраните свою таблицу поиска.

Это делает ваши объекты максимально легкими, сохраняя при этом их отношения.

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

person user11705765    schedule 27.06.2019