Учебники

Entity Framework — Отношения

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

  • Ученик
  • Курс
  • регистрация

Реляционная база данных

На приведенной выше диаграмме вы можете увидеть какую-то связь / связь между таблицами. Существует три типа отношений между таблицами, и отношения между различными таблицами зависят от того, как определены связанные столбцы.

  • Отношения один-ко-многим
  • Отношения многие ко многим
  • Индивидуальные отношения

Отношения один-ко-многим

  • Отношения «один ко многим» являются наиболее распространенным типом отношений.

  • В этом типе отношений строка в таблице A может иметь много совпадающих строк в таблице B, но строка в таблице B может иметь только одну соответствующую строку в таблице A.

  • Внешний ключ определен в таблице, которая представляет собой конец множества отношений.

  • Например, на приведенной выше диаграмме таблицы «Учащийся» и «Зачисление» имеют отношение «один-ко-многим», у каждого учащегося может быть много зачислений, но каждая запись принадлежит только одному учащемуся.

Отношения «один ко многим» являются наиболее распространенным типом отношений.

В этом типе отношений строка в таблице 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.

  • Например, таблицы «Студент» и «Курс» имеют отношение «многие ко многим», которое определяется отношением «один ко многим» из каждой из этих таблиц с таблицей регистрации.

Вы можете создать такое отношение, определив третью таблицу, называемую соединительной таблицей, первичный ключ которой состоит из внешних ключей из таблицы 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, и наоборот.

  • Отношение один к одному создается, если оба связанных столбца являются первичными ключами или имеют уникальные ограничения.

  • В отношении «один к одному» первичный ключ действует дополнительно как внешний ключ, и для каждой таблицы нет отдельного столбца внешнего ключа.

В отношении «один к одному» строка в таблице 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.

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