contract@chaoreumsoft.co.kr |    031-921-0523

Entity Framework 6의 엔터티 간의 관계

페이지 정보

작성자최고관리자

본문

엔터티 프레임워크가 엔터티 간의 관계를 관리하는 방법을 배웁니다.


엔터티 프레임워크는 데이터베이스와 같은 세 가지 유형의 관계를 지원합니다. 1) 일대일 2) 일대다 3) 다대다


다음 그림은 해당 EDM의 비주얼 디자이너와 모든 엔터티 및 이들 간의 관계를 보여줍니다.

0dc9464e270a7c53b10f992ce51c360e_1651217069_9191.png
엔터티 프레임워크에서 각 관계(연관)를 어떻게 관리하는지 살펴보겠습니다.


일대일 관계 

위의 그림에서 볼 수 있듯이 Student와 StudentAddress는 일대일 관계(0 또는 1)를 갖습니다.

학생은 하나 또는 0개의 주소만 가질 수 있습니다.

StudentAddress 엔터티는 PrimaryKey와 ForeignKey로 StudentId 속성을 모두 가지므로 일대일 관계가 됩니다.


public partial class Student
{
    public Student()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public Nullable<int> StandardId { get; set; }
    public byte[] RowVersion { get; set; }
    
    public virtual StudentAddress StudentAddress { get; set; }
    }
    
public partial class StudentAddress
{
    public int StudentID { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    
    public virtual Student Student { get; set; }
}

위의 예에서 StudentId 속성은 PrimaryKey와 ForeignKey여야 합니다. 이는 컨텍스트 클래스의 OnModelCreating 메서드에서 Fluent API를 사용하여 구성할 수 있습니다.



일대다 관계 

Standard 및 Teacher 엔터티는 다중성으로 표시된 일대다 관계가 있습니다. 여기서 1은 1이고 *는 다수입니다. 즉, 표준에는 여러 교사가 있을 수 있지만 교사는 하나의 표준에만 연결할 수 있습니다.


이를 나타내기 위해 Standard 엔터티에는 Teachers 컬렉션 탐색 속성(복수형임을 유의 하십시오)이 있으며, 이는 하나의 Standard에 Teacher(많은 교사) 컬렉션이 있을 수 있음을 나타냅니다. 그리고 Teacher 엔터티에는 Teacher가 하나의 표준과 연결되어 있음을 나타내는 Standard 탐색 속성(참조 속성)이 있습니다. 또한 StandardId 외래 키(표준 엔터티의 PK)도 포함합니다. 이렇게 하면 일대다 관계가 됩니다.

public partial class Standard
{
    public Standard()
    {
        this.Teachers = new HashSet<Teacher>();
    }
    
    public int StandardId { get; set; }
    public string StandardName { get; set; }
    public string Description { get; set; }
    
    public virtual ICollection<Teacher> Teachers { get; set; }
}

public partial class Teacher
{
    public Teacher()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int TeacherId { get; set; }
    public string TeacherName { get; set; }
    public Nullable<int> TeacherType { get; set; }
  


다대다 관계 

학생과 과정은 * 다중도로 표시된 다대다 관계를 갖습니다. 즉, 한 학생이 여러 코스에 등록할 수 있고 또한 하나의 코스를 여러 학생에게 가르칠 수 있습니다.

데이터베이스에는 두 테이블(Student 및 Course 테이블)의 기본 키를 포함하는 StudentCourse 조인 테이블이 포함됩니다. Entity Framework는 CSDL 및 비주얼 디자이너에서 조인 테이블에 대한 엔터티 집합(DbSet 속성)이 없어 다대다 관계를 나타냅니다. 대신 매핑을 통해 이를 관리합니다.


위 그림에서 볼 수 있듯이 Student 엔터티에는 Courses 컬렉션 탐색 속성이 포함되어 있고 Course 엔터티에는 Students 컬렉션 탐색 속성이 포함되어 있어 둘 사이의 다대다 관계를 나타냅니다.


다음 코드 조각은 Student 및 Course 엔터티 클래스를 보여줍니다.

public partial class Student
{
    public Student()
    {
        this.Courses = new HashSet<Course>();
    }
    
    public int StudentID { get; set; }
    public string StudentName { get; set; }
    public Nullable<int> StandardId { get; set; }
    public byte[] RowVersion { get; set; }
    
    public virtual ICollection<Course> Courses { get; set; }
}
    
public partial class Course
{
    public Course()
    {
        this.Students = new HashSet<Student>();
    }
    
    public int CourseId { get; set; }
    public string CourseName { get; set; }
    public System.Data.Entity.Spatial.DbGeography Location { get; set; }
    
    public virtual ICollection<Student> Students { get; set; }
}

참고: 엔터티 프레임워크는 조인 테이블(이 경우 StudentCourse)에 두 테이블의 PK 이외의 열이 포함되지 않은 경우에만 다대다 관계를 지원합니다. 조인 테이블에 DateCreated와 같은 추가 열이 포함된 경우 EDM은 중간 테이블에도 엔터티를 생성하므로 다대다 엔터티에 대한 CRUD 작업을 수동으로 관리해야 합니다.


XML 보기에서 EDM을 엽니다. SSDL(스토리지 스키마)에는 StudentCourse 엔티티 세트가 있지만 CSDL에는 없는 것을 볼 수 있습니다. 대신 Student 및 Course 엔터티의 탐색 속성에 매핑됩니다. MSL(C-S Mapping)에는 <AssociationSetMapping/> 섹션의 StudentCourse 테이블에 학생과 코스 간의 매핑이 있습니다.

0dc9464e270a7c53b10f992ce51c360e_1651217555_1567.png
 

따라서 다대다 관계는 EDM에서 C-S 매핑으로 관리되고 있습니다. 따라서 과정에 학생을 추가하거나 학생 엔터티에 과정을 추가하고 저장하면 추가된 학생 및 과정의 PK가 StudentCourse 테이블에 삽입됩니다. 따라서 이 매핑은 두 엔터티 간의 편리한 연결을 직접 가능하게 할 뿐만 아니라 이러한 조인에 대한 쿼리, 삽입 및 업데이트를 관리합니다.



Tag
Entity Framework Core 사용법, EF Core
© Chaoreumsoft Corp. All rights reserved.