Важно понимать, что ваши DbSet<...>
классы в вашем DbContext
представляют таблицы в вашей базе данных.
Класс в DbSet<...>
представляет одну строку в таблице, и отношения между этим строка и строки из других таблиц.
В структуре сущностей не виртуальные свойства представляют столбцы таблиц, виртуальные свойства представляют отношения между таблицами (один ко многим, много to-many)
Мне кажется, что существует связь один-ко-многим между Student и UniversityStudentAssociation: каждый студент имеет ноль или более ассоциаций UniversityStudent, и каждая ассоциация UniversityStudent принадлежит точно одному студенту, а именно Ученик, к которому относится свойство Student
.
Аналогичным образом, между Университетом и Университетской Студенческой Ассоциацией существует однозначное отношение: каждый Университет имеет ноль или более Ассоциаций Университетских Студентов, и каждая Ассоциация Университетских Студентов принадлежит ровно одному Университету Например, университет, на который ссылается свойство University
.
Из-за этих двух отношений «один ко многим» фактически существует отношение «многие ко многим» между студентом и университетом: каждый студент посещает ноль. или более университетов, и каждый университет обучает ноль или более студентов. Таблица UniversityStudentAssociation служит (расширенной) соединительной таблицей для реализации этого отношения «многие ко многим» (см. отношения «многие ко многим» )
Если вы следуете соглашениям о структуре сущностей Ваши занятия будут выглядеть следующим образом.
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
// every Student has zero or more UniversityStudentAssociations (one-to-many)
public virtual ICollection<UniversityStudentAssociation> UniversityStudentAssociations {get; set;}
}
public class University
{
public int Id { get; set; }
public string Name { get; set; }
// every University has zero or more UniversityStudentAssociations (one-to-many)
public virtual ICollection<UniversityStudentAssociation> UniversityStudentAssociations {get; set;}
}
Класс UniversityStudentAssociation:
public class UniversityStudentAssociation
{
public int Id { get; set; }
public string Name { get; set; }
// Every UniversityStudentAssociation belongs to exactly one Student, using foreign key
public int StudentId {get; set; }
public virtual Student Student { get; set; }
// Every UniversityStudentAssociation belongs to exactly one University, using foreign key
public int UniversityId {get; set; }
public virtual University University { get; set; }
// Every UniversityStudentAssociation has zero or more Subjects (one-to-many)
public IEnumerable<Subject> Subjects { get; set; }
}
И, наконец, предметный класс:
public class Subject
{
public int Id { get; set; }
public string Name { get; set; }
// every Subject belongs to exactly one UniversityStudentAssociation using foreign key
public int UniversityStudentAssociationId {get; set; }
public virtual UniversityStudentAssociation UniversityStudentAssociation {get; set;}
}
Обратите внимание, что я добавил виртуальные члены для информирования структуры сущностей об отношениях между таблицами. Поскольку одна сторона имеет виртуальную коллекцию ICollection <...>, а другая - один виртуальный элемент, структура сущностей знает, что это отношение один ко многим.
Другим важным изменением является добавление внешнего ключи. Если вы пропустите их, то сущностная структура все равно добавит их. Я добавил их, потому что не виртуальные свойства класса представляют столбцы в вашей таблице. Я хочу уточнить, какие столбцы в таблице. Кроме того, иногда это позволяет вам выполнять определенные объединения, если вы не можете использовать виртуальные коллекции.
Обычно, если вы хотите "получить элементы с (некоторыми или всеми) их подэлементами, вы можете использовать Коллекции:
Дайте мне (некоторые свойства) всех студентов, которые живут в Нью-Йорке и (некоторые свойства) всех университетов, которые они посещают
var result = dbContext.Students
.Where(student => student.City == "New York)
.Select(student => new
{
// Select only the Student properties that you plan to use:
Id = student.Id,
Name = student.Name,
...
Universities = student.UniversityStudentAssociations
.Select(association => new
{
// I only want the university properties
// again: only the properties that you plan to use:
UniversityId = association.University.Id,
UniversityName = association.University.Name,
}