Share via


연습: 여러 테이블에 엔터티 매핑

이 항목에서는 EDM(엔터티 데이터 모델)에서 개념적 모델을 수정하여 엔터티 형식을 두 개의 테이블에 매핑하는 방법을 보여 줍니다. 테이블이 공통 키를 공유하는 경우 한 엔터티를 여러 테이블에 매핑할 수 있습니다. 두 개의 테이블에 한 엔터티 형식 매핑에 적용되는 개념은 셋 이상의 테이블에 한 엔터티 형식 매핑으로 쉽게 확장됩니다. 한 엔터티를 여러 테이블에 매핑하는 방법에 대한 자세한 내용은 How to: Define a Model with Single Entity Mapped to Two Tables를 참조하십시오.

이 연습에서는 CourseManager 응용 프로그램에서 사용된 EDM을 수정하여 한 엔터티 형식을 두 개의 테이블에 매핑합니다. 자세한 내용은 이 항목의 뒷부분에 있는 필수 구성 요소 단원을 참조하십시오. 새 엔터티 형식(Person 엔터티 형식에서 파생된 Instructor)을 만들고 PersonOfficeAssignment 테이블에 매핑합니다. 다음 단계에는 이 프로세스가 요약되어 있으며, 이 문서의 뒷부분에 있는 절차에서 자세히 설명합니다.

  1. 새 엔터티 형식인 Instructor를 만듭니다.

  2. Instructor의 기본 형식을 Person으로 설정합니다.

    Cc716698.note(ko-kr,VS.100).gif참고:
    한 엔터티 형식을 여러 테이블에 매핑하기 위해 상속 계층 구조를 만들 필요는 없습니다. 이 예제에서는 보다 사실적으로 구현하기 위해 상속 계층 구조가 사용되었습니다. 학교에서는 강사에게만 사무실이 할당됩니다. Instructor 엔터티 형식을 만들지 않고도 Person 엔터티 형식을 PersonOfficeAssignment 테이블에 모두 매핑할 수 있습니다.

  3. PersonHireDate 속성을 Instructor로 이동합니다.

  4. OfficeAssignmentLocation 속성을 Instructor로 이동합니다.

  5. HireDate Is Not Null 조건을 사용하여 Instructor 엔터티를 Person 테이블에 매핑합니다. HireDate 열을 HireDate 속성에 매핑합니다.

  6. 조건 없이 Instructor 엔터티를 OfficeAssignment 테이블에 매핑합니다. InstructorID 열을 PersonID 속성에 매핑하고 Location 열을 Location 속성에 매핑합니다.

  7. OfficeAssignment 엔터티 형식을 삭제합니다.

필수 구성 요소

이 연습을 수행하려면 먼저 CourseManager 응용 프로그램을 빌드해야 합니다. 자세한 내용은 Entity Framework 퀵 스타트를 참조하십시오. 새 엔터티 형식을 추가하고 두 개의 테이블에 매핑하여 CourseManager 응용 프로그램에서 사용된 EDM을 수정합니다. 그런 다음 응용 프로그램의 기능을 확장하여 강사의 사무실 할당을 표시합니다.

Cc716698.note(ko-kr,VS.100).gif참고:
이 설명서에 있는 대부분의 연습 항목에서는 CourseManager 응용 프로그램을 시작 지점으로 사용하므로 원래 CourseManager 코드를 편집하지 않고 연습용으로 CourseManager 응용 프로그램을 복사하여 사용하는 것이 좋습니다.

이 연습에서는 독자가 Visual Studio, .NET Framework 및 Visual C# 또는 Visual Basic 프로그래밍에 대한 기본적인 지식을 가지고 있다고 가정합니다.

두 개의 테이블에 엔터티 매핑

이 절차에서는 새 엔터티 형식(Instructor)을 만들고 두 개의 테이블(PersonOfficeAssignment)에 매핑하여 SchoolModel EDM의 개념적 부분을 수정합니다.

엔터티를 두 개의 테이블에 매핑하려면

  1. Visual Studio에서 CourseManager 솔루션을 엽니다.

  2. 솔루션 탐색기에서 School.edmx 파일을 두 번 클릭합니다.

    School.edmx 파일이 엔터티 데이터 모델 디자이너(Entity Designer)에서 열립니다.

  3. Entity Designer 디자인 화면의 빈 영역을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 엔터티를 클릭합니다.

    새 엔터티 대화 상자가 나타납니다.

  4. 엔터티 이름으로 Instructor를 입력하고 기본 형식 드롭다운 목록에서 Person을 선택합니다.

  5. 확인을 클릭합니다.

    새 엔터티 형식이 만들어져 디자인 화면에 표시됩니다.

  6. Person 엔터티 형식의 HireDate 속성(스칼라 속성 아래에 있음)을 마우스 오른쪽 단추로 클릭하고 잘라내기를 선택합니다.

  7. Instructor 엔터티 형식의 스칼라 속성을 마우스 오른쪽 단추로 클릭하고 붙여넣기를 선택합니다.

  8. HireDate 속성을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

    속성 창이 나타납니다.

  9. 속성 창에서 Nullable 속성을 false로 설정합니다.

  10. OfficeAssignment 엔터티 형식의 Location 속성을 마우스 오른쪽 단추로 클릭하고 잘라내기를 선택합니다.

  11. Instructor 엔터티 형식의 스칼라 속성을 마우스 오른쪽 단추로 클릭하고 붙여넣기를 선택합니다.

  12. Location 속성을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

  13. 속성 창에서 Nullable 속성을 false로 설정합니다.

  14. OfficeAssignment 형식의 Timestamp 속성에 대해 10-13단계를 반복합니다.

    Cc716698.note(ko-kr,VS.100).gif참고:
    다음 단계에서는 매핑 정보 창이 필요합니다. 이 창이 표시되지 않으면 디자인 화면을 마우스 오른쪽 단추로 클릭하고 매핑 정보를 선택합니다.

  15. Instructor 엔터티 형식을 선택하고 매핑 정보 창에서 **<테이블 또는 뷰 추가>**를 클릭합니다.

    <테이블 또는 뷰 추가> 필드는 선택한 엔터티를 매핑할 수 있는 테이블 또는 뷰의 드롭다운 목록이 됩니다.

  16. 드롭다운 목록에서 Person을 선택합니다.

    매핑 정보 창이 기본 열 매핑과 조건 추가 옵션으로 업데이트됩니다.

  17. **<조건 추가>**를 클릭합니다.

    <조건 추가> 필드는 조건이 설정될 수 있는 열의 드롭다운 목록이 됩니다.

  18. 드롭다운 목록에서 HireDate를 선택합니다.

  19. 매핑 정보 창의 연산자 열에 있는 드롭다운 목록에서 Is를 선택합니다.

  20. 매핑 정보 창의 속성/값 열에서 Not Null을 선택합니다.

  21. **<테이블 또는 뷰 추가>**를 클릭하고 드롭다운 목록에서 OfficeAssignment를 선택합니다.

    매핑 정보 창이 기본 열 매핑으로 업데이트됩니다.

  22. InstructorID 열에 해당하는 속성/값 필드를 클릭하고 드롭다운 목록에서 PersonID를 선택합니다.

  23. OfficeAssignment 엔터티 형식을 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

이제 Instructor 엔터티 형식이 PersonOfficeAssignment 테이블에 매핑되었습니다.

사용자 인터페이스 생성

다음에는 CourseAssignmentForm 폼을 로드 및 표시하는 단추를 CourseViewer 폼에 추가합니다. 그런 후에 Instructor 사무실 위치를 표시하기 위해 DataGridView 컨트롤을 폼에 추가합니다. 마지막으로, 업데이트를 데이터베이스에 저장하는 단추를 CourseAssignmentForm에 추가합니다.

사용자 인터페이스를 생성하려면

  1. 솔루션 탐색기에서 CourseManager 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목을 선택합니다.

    새 항목 추가 대화 상자가 나타납니다.

  2. Windows Form을 선택하고 폼의 이름을 OfficeAssignment.vb 또는 OfficeAssignment.cs로 설정한 다음 추가를 클릭합니다.

    새 폼이 프로젝트에 추가되고 폼 디자이너에서 열립니다. 폼의 이름은 OfficeAssignment로 설정되고 텍스트는 OfficeAssignment로 설정됩니다.

  3. DataGridView 컨트롤을 폼으로 끌어다 놓고 해당 이름을 officeGridView로 설정합니다.

  4. DataGridView의 스마트 태그를 클릭하고 추가 사용삭제 사용 옵션을 선택 취소합니다.

  5. Button 컨트롤을 폼으로 끌어다 놓은 후 해당 이름 속성을 saveChanges로 설정하고 텍스트 속성을 Update로 설정합니다.

  6. 솔루션 탐색기에서 CourseViewer.cs 또는 CourseViewer.vb를 두 번 클릭합니다.

    CourseViewer 폼의 디자인 뷰가 나타납니다.

  7. 도구 상자에서 Button 컨트롤을 CourseViewer 폼으로 끌어다 놓습니다.

  8. 속성 창에서 단추의 이름을 viewOffices로 설정하고 단추의 텍스트를 View Offices로 설정합니다.

  9. viewOffices Button을 두 번 클릭합니다.

    CourseViewer의 코드 숨김 파일이 열립니다.

  10. viewOffices_click 이벤트 처리기에 다음 코드를 추가합니다.

    Dim officeForm As New OfficeAssignment()
    officeForm.Visible = True
    
    OfficeAssignment officeForm = new OfficeAssignment();
    officeForm.Visible = true;
    

이제 이 폼의 사용자 인터페이스가 완료되었습니다.

EDM 쿼리

이 응용 프로그램은 DataGridView 컨트롤을 SchoolModel EDM에 바인딩하여 데이터를 표시합니다. DataGridView 컨트롤에 표시되는 정보를 편집할 수 있으며, 변경 내용을 데이터베이스에 저장할 수 있습니다. 개체를 컨트롤에 바인딩하는 방법에 대한 자세한 내용은 Binding Objects to Controls (Entity Framework)을 참조하십시오.

EDM을 쿼리하려면

  1. 폼 디자이너에 OfficeAssignment 폼이 열려 있는 상태로 폼의 본문을 두 번 클릭합니다.

    OfficeAssignment 폼의 코드 숨김 파일이 열립니다.

  2. School 데이터베이스와 엔터티 네임스페이스에서 만든 모델을 참조하는 다음 using(C#) 또는 Imports(Visual Basic) 문을 추가합니다.

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  3. 데이터 컨텍스트를 나타내는 속성을 OfficeAssignment 클래스에 추가합니다.

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    // Create an ObjectContext instance based on SchoolEntity.
    private SchoolEntities schoolContext;
    
  4. OfficeAssignment_Load 이벤트 처리기에서 개체 컨텍스트를 초기화하고 Instructor 정보를 반환하는 쿼리에 DataGridView 컨트롤을 바인딩하는 코드를 추가합니다.

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Get Persons of type Instructor.
    Dim instructorQuery As ObjectQuery(Of Instructor) = _
        schoolContext.People.OfType(Of Instructor)()
    
    ' Bind the query results to the GridView control.
    ' Display only location and name.
    officeGridView.DataSource = instructorQuery _
        .Execute(MergeOption.OverwriteChanges)
    officeGridView.Columns("HireDate").Visible = False
    officeGridView.Columns("PersonID").Visible = False
    officeGridView.Columns("Timestamp").Visible = False
    officeGridView.Columns("EnrollmentDate").Visible = False
    officeGridView.Columns("StudentGrades").Visible = False
    officeGridView.Columns("Courses").Visible = False
    
    schoolContext = new SchoolEntities();
    
    // Get Persons of type Instructor.
    ObjectQuery<Instructor> instructorQuery = schoolContext
        .People.OfType<Instructor>();
    
    // Bind the query results to the GridView control.
    // Display only location and name.
    officeGridView.DataSource = instructorQuery
        .Execute(MergeOption.OverwriteChanges);
    officeGridView.Columns["HireDate"].Visible = false;
    officeGridView.Columns["Timestamp"].Visible = false;
    officeGridView.Columns["PersonID"].Visible = false;
    officeGridView.Columns["EnrollmentDate"].Visible = false;
    officeGridView.Columns["StudentGrades"].Visible = false;
    officeGridView.Columns["Courses"].Visible = false;
    
  5. OfficeAssignment 폼의 디자인 뷰로 돌아가서 saveChangesButton 컨트롤을 두 번 클릭합니다.

    saveChanges_Click 이벤트 처리기가 코드 숨김 파일에 만들어집니다.

  6. DataGridView 컨트롤에서 변경된 내용을 데이터베이스에 저장하는 코드를 이벤트 처리기에 추가합니다.

    ' Save object changes to the database, 
    ' display a message, and refresh the form.
    schoolContext.SaveChanges()
    MessageBox.Show("Change(s) saved to the database.")
    Me.Refresh()
    
    // Save object changes to the database, 
    // display a message, and refresh the form.
    schoolContext.SaveChanges();
    MessageBox.Show("Change(s) saved to the database.");
    this.Refresh();
    

이제 응용 프로그램이 완료되었습니다. 응용 프로그램을 실행하려면 Ctrl + F5를 누릅니다. OfficeAssignments 폼을 로드하려면 View Offices 단추를 클릭합니다. 강사 이름과 사무실 위치가 표시됩니다. 표시되는 정보를 편집할 수 있으며, Update 단추를 클릭하여 변경 내용을 데이터베이스에 저장할 수 있습니다.

코드 목록

이 단원에는 OfficeAssignmentForm 폼에 대한 코드 숨김 파일의 최종 버전이 포함되어 있습니다.

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class OfficeAssignment
    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

    Private Sub OfficeAssignment_Load(ByVal sender As System.Object, _
                                      ByVal e As System.EventArgs) _
                                      Handles MyBase.Load
        ' Initialize the ObjectContext.
        schoolContext = New SchoolEntities()

        ' Get Persons of type Instructor.
        Dim instructorQuery As ObjectQuery(Of Instructor) = _
            schoolContext.People.OfType(Of Instructor)()

        ' Bind the query results to the GridView control.
        ' Display only location and name.
        officeGridView.DataSource = instructorQuery _
            .Execute(MergeOption.OverwriteChanges)
        officeGridView.Columns("HireDate").Visible = False
        officeGridView.Columns("PersonID").Visible = False
        officeGridView.Columns("Timestamp").Visible = False
        officeGridView.Columns("EnrollmentDate").Visible = False
        officeGridView.Columns("StudentGrades").Visible = False
        officeGridView.Columns("Courses").Visible = False
    End Sub

    Private Sub saveChanges_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) _
                                  Handles saveChanges.Click
        ' Save object changes to the database, 
        ' display a message, and refresh the form.
        schoolContext.SaveChanges()
        MessageBox.Show("Change(s) saved to the database.")
        Me.Refresh()
    End Sub
End Class
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.Objects;
using System.Data.Objects.DataClasses;

namespace CourseManager
{
    public partial class OfficeAssignment : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public OfficeAssignment()
        {
            InitializeComponent();
        }

        private void OfficeAssignment_Load(object sender, EventArgs e)
        {
            schoolContext = new SchoolEntities();

            // Get Persons of type Instructor.
            ObjectQuery<Instructor> instructorQuery = schoolContext
                .People.OfType<Instructor>();

            // Bind the query results to the GridView control.
            // Display only location and name.
            officeGridView.DataSource = instructorQuery
                .Execute(MergeOption.OverwriteChanges);
            officeGridView.Columns["HireDate"].Visible = false;
            officeGridView.Columns["Timestamp"].Visible = false;
            officeGridView.Columns["PersonID"].Visible = false;
            officeGridView.Columns["EnrollmentDate"].Visible = false;
            officeGridView.Columns["StudentGrades"].Visible = false;
            officeGridView.Columns["Courses"].Visible = false;
        }

        private void saveChanges_Click(object sender, EventArgs e)
        {
            // Save object changes to the database, 
            // display a message, and refresh the form.
            schoolContext.SaveChanges();
            MessageBox.Show("Change(s) saved to the database.");
            this.Refresh();
        }
    }
}

다음 단계

한 엔터티를 여러 테이블에 성공적으로 매핑했습니다. 한 엔터티를 여러 테이블에 매핑하여 모델을 만드는 방법에 대한 자세한 내용은 How to: Define a Model with a Single Entity Mapped to Two Tables를 참조하십시오. Entity Framework를 사용하는 응용 프로그램을 빌드하는 방법에 대한 자세한 내용은 Programming Guide (Entity Framework)를 참조하십시오.

참고 항목

기타 리소스

ADO.NET 엔터티 데이터 모델 디자이너 시나리오
엔터티 데이터 모델 도구 작업