Entity Framework - отношения
В реляционных базах данных отношения - это ситуация, которая существует между таблицами реляционной базы данных через внешние ключи. Внешний ключ (FK) - это столбец или комбинация столбцов, которые используются для установления и обеспечения связи между данными в двух таблицах. Следующая диаграмма содержит три таблицы.
- Student
- Course
- Enrollment
На приведенной выше диаграмме вы можете увидеть какую-то связь / связь между таблицами. Между таблицами существует три типа отношений, и отношения между разными таблицами зависят от того, как определены связанные столбцы.
- Отношения один-ко-многим
- Отношения "многие ко многим"
- Индивидуальные отношения
Отношения один-ко-многим
Отношения "один ко многим" - наиболее распространенный тип отношений.
В этом типе отношений строка в таблице A может иметь много совпадающих строк в таблице B, но строка в таблице B может иметь только одну совпадающую строку в таблице A.
Внешний ключ определяется в таблице, которая представляет собой конец отношения.
Например, на приведенной выше диаграмме таблицы «Студент» и «Зачисление» связаны отношениями «один ко многим», каждый студент может иметь несколько зачислений, но каждое зачисление принадлежит только одному студенту.
В структуре сущностей эти отношения также могут быть созданы с помощью кода. Ниже приводится пример классов «Студент» и «Зачисление», которые связаны отношениями «один ко многим».
public class Student {
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
public class Enrollment {
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
public Grade? Grade { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
В приведенном выше коде вы можете видеть, что класс Student содержит коллекцию Enrollment, но класс Enrollment имеет один объект Student.
Отношения "многие ко многим"
В отношении «многие ко многим» строка в таблице A может иметь много совпадающих строк в таблице B, и наоборот.
Вы можете создать такую связь, определив третью таблицу, называемую таблицей соединений, первичный ключ которой состоит из внешних ключей из таблицы A и таблицы B.
Например, таблицы «Студент» и «Курс» имеют отношение «многие ко многим», которое определяется отношением «один ко многим» из каждой из этих таблиц в таблицу регистрации.
Следующий код содержит класс Course и два вышеупомянутых класса, т. Е. Student и Enrollment.
public class Course {
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CourseID { get; set; }
public string Title { get; set; }
public int Credits { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
}
Вы можете видеть, что и класс Course, и класс Student имеют коллекции объектов Enrollment, которые устанавливают отношения «многие ко многим» через Enrollment класса соединения.
Индивидуальные отношения
При взаимно-однозначном отношении строка в таблице A может иметь не более одной совпадающей строки в таблице B, и наоборот.
Отношение «один к одному» создается, если оба связанных столбца являются первичными ключами или имеют уникальные ограничения.
При однозначной связи первичный ключ дополнительно действует как внешний ключ, и для каждой таблицы нет отдельного столбца внешнего ключа.
Этот тип отношений встречается не часто, потому что большая часть информации, связанной таким образом, будет находиться в одной таблице. Вы можете использовать отношения один к одному, чтобы -
- Разделите таблицу на множество столбцов.
- Изолируйте часть стола по соображениям безопасности.
- Храните данные, которые недолговечны и могут быть легко удалены, просто удалив таблицу.
- Храните информацию, которая применяется только к подмножеству основной таблицы.
Следующий код предназначен для добавления другого класса с именем StudentProfile, который содержит идентификатор электронной почты и пароль учащегося.
public class Student {
public int ID { get; set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual ICollection<Enrollment> Enrollments { get; set; }
public virtual StudentProfile StudentProfile { get; set; }
}
public class StudentProfile {
public StudentProfile() {}
public int ID { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public virtual Student Student { get; set; }
}
Вы можете видеть, что класс сущности Student содержит свойство навигации StudentProfile, а StudentProfile содержит свойство навигации Student.
У каждого студента есть только один адрес электронной почты и пароль для входа в домен университета. Эту информацию можно добавить в таблицу учеников, но по соображениям безопасности она отделена от другой таблицы.