Entity Framework-관계

관계형 데이터베이스에서 관계는 외래 키를 통해 관계형 데이터베이스 테이블간에 존재하는 상황입니다. FK (외래 키)는 두 테이블의 데이터간에 연결을 설정하고 적용하는 데 사용되는 열 또는 열 조합입니다. 다음 다이어그램에는 세 개의 테이블이 있습니다.

  • Student
  • Course
  • Enrollment

위의 다이어그램에서 테이블 간의 일종의 연관 / 관계를 볼 수 있습니다. 테이블 간에는 세 가지 유형의 관계가 있으며 서로 다른 테이블 간의 관계는 관련 열이 정의 된 방식에 따라 다릅니다.

  • 일대 다 관계
  • 다 대다 관계
  • 일대일 관계

일대 다 관계

  • 일대 다 관계는 가장 일반적인 관계 유형입니다.

  • 이러한 유형의 관계에서 테이블 A의 행은 테이블 B에서 일치하는 행을 많이 가질 수 있지만 테이블 B의 행은 테이블 A에서 일치하는 행을 하나만 가질 수 있습니다.

  • 외래 키는 관계의 많은 끝을 나타내는 테이블에 정의됩니다.

  • 예를 들어, 위의 다이어그램에서 Student 및 Enrollment 테이블에는 일대일 관계가 있고 각 학생은 여러 등록을 가질 수 있지만 각 등록은 한 학생에게만 속합니다.

엔티티 프레임 워크에서 이러한 관계는 코드로도 생성 될 수 있습니다. 다음은 일대 다 관계와 관련된 학생 및 등록 클래스의 예입니다.

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의 외래 키로 구성됩니다.

  • 예를 들어, Student 및 Course 테이블에는 이러한 각 테이블에서 Enrollment 테이블로의 일대 다 관계로 정의되는 다 대다 관계가 있습니다.

다음 코드에는 Course 클래스와 위의 두 클래스가 포함되어 있습니다. StudentEnrollment.

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 개체 컬렉션이 있음을 알 수 있습니다.

일대일 관계

  • 일대일 관계에서 테이블 A의 행은 테이블 B에서 일치하는 행을 하나만 가질 수 있으며 그 반대의 경우도 마찬가지입니다.

  • 관련 열이 모두 기본 키이거나 고유 한 제약 조건이있는 경우 일대일 관계가 생성됩니다.

  • 일대일 관계에서 기본 키는 추가로 외래 키 역할을하며 두 테이블에 대한 별도의 외래 키 열이 없습니다.

이러한 방식으로 관련된 대부분의 정보가 모두 하나의 테이블에 있기 때문에 이러한 유형의 관계는 일반적이지 않습니다. 일대일 관계를 사용할 수 있습니다.

  • 열이 많은 테이블을 나눕니다.
  • 보안상의 이유로 테이블의 일부를 분리하십시오.
  • 수명이 짧고 테이블 삭제만으로 쉽게 삭제할 수있는 데이터를 저장합니다.
  • 기본 테이블의 하위 집합에만 적용되는 정보를 저장합니다.

다음 코드는 학생 이메일 ID와 비밀번호를 포함하는 다른 클래스 이름 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 테이블에 추가 할 수 있지만 보안상의 이유로 다른 테이블로 분리됩니다.