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.

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