Entity Framework Core — Настройка сущности имеет виртуальную коллекцию, которая может объединяться по условию двух разныC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Entity Framework Core — Настройка сущности имеет виртуальную коллекцию, которая может объединяться по условию двух разны

Сообщение Гость »


Я использую .Net 7 и EF Core 7.

У меня есть сущность с именем «Студент». У студента есть два свойства: StudentId (первичный ключ) и GradeId.

публичный класс Student { общественный Guid StudentId {получить; набор; } общедоступная строка Имя {get; набор; } общественный Guid GradeId {получить; набор; }

У меня есть класс Course, содержащий информацию о курсе.

Курс общедоступного класса { общественный Guid CourseId {получить; набор; } общедоступная строка Имя {get; набор; }

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

публичный класс StudentRegisteredCourse { общедоступный идентификатор Guid {get; набор; } общественный Guid StudentId {получить; набор; } общественный Guid CourseId {получить; набор; }

публичный класс GradeCourse { общедоступный идентификатор Guid {get; набор; } общественный Guid GradeId {получить; набор; } общественный Guid CourseId {получить; набор; }

Например, у меня Джон учится в 10 классе. В 10 классе учащийся должен пройти курсы математики 10 и физики 10. Джон зарегистрировался на курс C# Foundation для себя.

Итак, у Джона будет три курса: математика 10, физика 10 и C# Foundation.

В настоящее время я могу создавать связанные курсы для учащихся с помощью двух виртуальных коллекций RegisteredCourses и GradeCourses.

публичный класс Student { общественный Guid StudentId {получить; набор; } общедоступная строка Имя {get; набор; } общественный Guid GradeId {получить; набор; } общественный виртуальный ICollection RegisteredCourses {get; набор; } общественный виртуальный ICollection GradeCourses {get; набор; }

При использовании GradeCourses необходимо присоединиться к GradeId вместо первичного ключа.

modelBuilder.Entity().HasMany(c => c.GradeCourses).WithOne().HasForeignKey(c => c .GradeId).HasPrincipalKey(c => c.GradeId);

Этот дизайн у меня работает, и я могу фильтровать список студентов, у которых есть определенный курс.

var StudentOfSpanishCourse = dbContext.Students.Where(c => c.RegisteredCourses.Any(c => c.CourseId = 'Идентификатор курса испанского языка ') || c.GradeCourses.Any(c => c.CourseId = 'Идентификатор курса испанского языка'));

Однако, как мы видим, нам нужно отфильтровать обе коллекции RegisterdCourses и GradeCourses, чтобы получить список студентов курсов испанского языка.

Я пытаюсь упростить это, найдя способ сделать так, чтобы у Student была только виртуальная коллекция с именем «CoursesOfStudent». CoursesOfStudent — это объединение всех StudentCourse и GradeCourse. Таким образом, при использовании Student для фильтрации нам просто нужно указать «где» только для одной коллекции.

Для этого я создал представление CourseOfStudent, которое объединяет таблицы StudentRegisteredCourse и GradeCourse.

Создать представление CourseOfStudent AS Выберите CourseId, StudentId, null в качестве GradeId из StudentRegisteredCourse. СОЮЗ ВСЕХ Выберите CourseId, значение null в качестве StudentId, GradeIdfrom GradeCourse. ;

Я создал сущность CourseOfStudent в EF и сопоставил ее с созданным представлением.

публичный класс CourseOfStudent { общественный Guid CourseId {получить; набор; } общественный Guid StudentId {получить; набор; } общественный Guid GradeId {получить; набор; }

и сущность Student изменяется, чтобы иметь эту коллекцию.

публичный класс Student { общественный Guid StudentId {получить; набор; } общедоступная строка Имя {get; набор; } общественный Guid GradeId {получить; набор; } общедоступный виртуальный ICollection CoursesOfStudent {get; набор; }

Моя текущая проблема заключается в том, что я не знаю, как настроить коллекцию CoursesOfStudent для наличия внешнего ключа, присоединиться к StudentId ИЛИ GradeId.

Может у кого-то есть такая же проблема? Можете ли вы дать мне несколько советов?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»