Share via


연습: 매핑 상속 - 형식당 하나의 테이블

이 항목에서는 EDM(엔터티 데이터 모델)에서 개념적 모델을 수정하여 형식당 하나의 테이블 상속을 구현하는 방법을 보여 줍니다. 형식당 하나의 테이블 상속에서는 데이터베이스의 별도 테이블을 사용하여 상속 계층 구조에 있는 각 형식의 상속되지 않는 속성 및 키 속성 데이터를 유지합니다. EDM으로 상속을 구현하는 방법에 대한 자세한 내용은 Inheritance (EDM)을 참조하십시오.

이 연습에서는 CourseManager 응용 프로그램에서 사용된 EDM을 수정하여 형식당 하나의 테이블 상속을 구현합니다. 자세한 내용은 이 항목의 뒷부분에 있는 필수 구성 요소 단원을 참조하십시오.

CourseManager 응용 프로그램에서 Course, OnlineCourseOnsiteCourse 엔터티 형식은 같은 이름의 테이블에 매핑됩니다. OnlineCourseOnsiteCourse 엔터티 형식에는 두 개의 과정 형식에 고유한 정보가 포함되고 공통 키를 공유하기 때문에 Course 엔터티 형식에서 상속하도록 변경할 수 있습니다. 다음 단계에는 이런 경우에서 형식당 하나의 테이블 상속을 구현하는 방법이 요약되어 있으며, 이 항목의 뒷부분에 있는 절차에서 자세히 설명합니다.

  1. OnlineCourse 엔터티 형식과 Course 엔터티 형식 간의 연결을 삭제합니다. OnsiteCourse 엔터티 형식과 Course 엔터티 형식 간의 연결을 삭제합니다. 이러한 연결은 상속 계층 구조를 구현하여 대체됩니다.

  2. OnlineCourseOnsiteCourse 엔터티 형식에서 CourseID 키 속성을 삭제합니다. 이 속성은 Course 엔터티 형식에서 상속됩니다.

  3. Course 엔터티 형식을 OnlineCourseOnsiteCourse 엔터티 형식의 기본 형식으로 설정합니다.

  4. Course 엔터티 형식을 추상 형식으로 설정합니다.

  5. OnlineCourseOnsiteCourse 엔터티 형식의 상속된 CourseID 속성을 적절한 열에 매핑합니다.

필수 구성 요소

이 연습을 수행하려면 먼저 CourseManager 응용 프로그램을 빌드해야 합니다. 자세한 내용과 지침은 Entity Framework 퀵 스타트를 참조하십시오. 형식당 하나의 테이블 상속을 구현하여 CourseManager 응용 프로그램에서 사용된 EDM을 수정합니다. 그런 다음 응용 프로그램의 기능을 확장하여 선택한 부서의 온라인 및 온사이트 과정을 별도로 표시합니다.

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

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

형식당 하나의 테이블 상속 구현

이 절차에서는 SchoolModel EDM의 개념적 부분을 변경하여 형식당 하나의 테이블 상속을 구현합니다.

형식당 하나의 테이블 상속을 구현하려면

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

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

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

  3. OnlineCourse 엔터티 형식을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

  4. 속성 창에서 Base Type 속성을 Course로 설정합니다.

  5. OnsiteCourse 엔터티 형식에 대해 3단계와 4단계를 반복합니다.

  6. OnlineCourseCourse 엔터티 형식 간의 연결(선)을 마우스 오른쪽 단추로 클릭합니다. 삭제를 선택합니다.

  7. OnsiteCourseCourse 엔터티 형식 간의 연결을 마우스 오른쪽 단추로 클릭합니다. 삭제를 선택합니다.

  8. OnlineCourse 엔터티 형식의 CourseID 속성을 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  9. OnsiteCourse 엔터티 형식의 CourseID 속성을 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  10. Course 엔터티 형식을 선택합니다. 속성 창에서 Abstract 속성을 true로 설정합니다.

    엔터티 형식을 추상으로 정의하면 해당 형식에 대한 기존 함수 매핑이 모두 제거된다고 알리는 메시지 상자가 나타납니다. 확인을 클릭합니다.

    Cc716702.note(ko-kr,VS.100).gif참고:
    이제 Course 엔터티 형식이 추상 형식으로 변경되었으므로 원래 CourseManager 응용 프로그램의 업데이트 기능이 작동하지 않습니다.

  11. OnlineCourse 엔터티 형식을 마우스 오른쪽 단추로 클릭하고 테이블 매핑을 선택합니다.

    매핑 정보 창이 나타납니다.

  12. CourseID 열에 해당하는 값/속성 필드를 클릭합니다.

    값/속성 필드는 해당 열에 매핑할 수 있는 속성의 드롭다운 목록이 됩니다.

  13. 드롭다운 목록에서 CourseID를 선택합니다.

  14. OnsiteCourse 엔터티 형식에 대해 11-13단계를 반복합니다.

이제 형식당 하나의 테이블 상속이 구현되었습니다.

사용자 인터페이스 생성

다음에는 CourseDiscrimForm 폼을 로드 및 표시하는 단추를 CourseViewer 폼에 추가합니다. 그런 후에 OnsiteCoursesOnlineCourses를 표시하기 위한 두 개의 DataGridView 컨트롤을 추가합니다. 마지막으로, DataGridViewBindingSource 컨트롤에 바인딩합니다. 개체를 컨트롤에 바인딩하는 방법에 대한 자세한 내용은 Binding Objects to Controls (Entity Framework)을 참조하십시오.

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

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

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

  2. Windows Form을 선택하고 추가를 클릭합니다.

    새 폼이 프로젝트에 추가되고 폼 디자이너에서 열립니다.

  3. 속성 창에서 폼의 이름을 CourseDiscriminator로 설정합니다.

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

  4. 도구 상자에서 ComboBox 컨트롤을 폼으로 끌어다 놓고 속성 창에서 해당 이름을 departmentList로 설정합니다.

  5. 도구 상자에서 DataGridView 컨트롤을 폼으로 끌어다 놓고 해당 이름을 onsiteGridView로 설정합니다.

  6. 도구 상자에서 다른 DataGridView 컨트롤을 폼으로 끌어다 놓고 해당 이름을 onlineGridView로 설정합니다.

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

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

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

  9. 속성 창에서 Button의 이름을 viewDiscriminator로 설정하고 단추의 텍스트를 Online vs. Onsite로 설정합니다.

  10. viewDiscriminator Button을 두 번 클릭합니다.

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

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

    Dim courseDiscrim As New CourseDiscriminator
    courseDiscrim.Visible = True
    
    CourseDiscriminator courseDiscrim = new CourseDiscriminator();
    courseDiscrim.Visible = true;
    

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

EDM 쿼리

이 절차에서는 EDM을 쿼리하고 그 결과를 Windows Forms 컨트롤에 바인딩합니다.

EDM을 쿼리하려면

  1. 폼 디자이너에서 CourseDiscriminator 폼을 엽니다.

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

  3. 속성 창에서 BindingSource의 이름을 onsiteBindingSource로 설정합니다.

  4. 속성 창에서 DataSource 속성 옆에 있는 필드를 클릭합니다.

    이 필드는 사용 가능한 데이터 소스의 드롭다운 목록이 됩니다.

  5. 프로젝트 데이터 소스 추가를 클릭합니다.

    데이터 소스 구성 마법사데이터 소스 형식 선택 창이 열립니다.

  6. 응용 프로그램이 데이터를 가져오는 위치 상자에서 개체를 선택합니다.

  7. 다음을 클릭합니다.

    바인딩할 개체 선택 창이 열립니다. 사용 가능한 리소스 트리의 최상위 노드가 표시됩니다.

  8. CourseManager 노드를 확장한 다음 SchoolModel(C#) 또는 CourseManager.SchoolModel(Visual Basic) 노드를 확장합니다.

  9. OnsiteCourse를 선택하고 마침을 클릭합니다.

  10. 2-9단계를 반복하지만, BindingSource 컨트롤의 이름을 OnlineBindingSource로 지정하고 OnlineCourse 개체에 바인딩합니다.

  11. OnsiteGridView 컨트롤을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

  12. 속성 창에서 DataSource 속성 옆에 있는 필드를 클릭합니다.

    이 필드는 사용 가능한 데이터 소스의 드롭다운 목록이 됩니다.

  13. OnsiteBindingSource를 선택합니다.

  14. OnlineGridView에 대해 11-13단계를 반복하지만, DataSouce 속성을 OnlineBindingSource로 설정합니다.

    Cc716702.note(ko-kr,VS.100).gif참고:
    OfType 메서드는 DataGridView 컨트롤이 런타임에 열을 생성할 수 없는 열거형을 반환합니다. 이 예제에서는 원하는 정보를 표시하기 위해 바인딩할 클래스를 기반으로 BindingSource 컨트롤을 통해 디자인 타임에 DataGridView 컨트롤의 데이터 소스가 설정됩니다.

  15. CourseDiscriminator 폼을 두 번 클릭합니다.

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

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

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

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

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Define a query that returns all Department objects and 
    ' related Course objects, ordered by name.
    Dim departmentQuery As ObjectQuery(Of Department) = _
        schoolContext.Departments.Include("Courses").OrderBy("it.Name")
    
    ' Bind the ComboBox control to the query, which is
    ' executed during data binding.
    departmentList.DisplayMember = "Name"
    departmentList.DataSource = departmentQuery. _
        Execute(MergeOption.OverwriteChanges)
    
    // Initialize the ObjectContext.
    schoolContext = new SchoolEntities();
    
    // Define a query that returns all Department objects  
    // and related Course objects, ordered by name.
    ObjectQuery<Department> departmentQuery = 
        schoolContext.Departments.Include("Courses").
        OrderBy("it.Name");
    
    // Bind the ComboBox control to the query.
    this.departmentList.DisplayMember = "Name";
    this.departmentList.DataSource = departmentQuery.
        Execute(MergeOption.OverwriteChanges);
    
  19. CourseDiscriminator 폼의 디자인 뷰로 돌아가서 departmentListComboBox 컨트롤을 두 번 클릭합니다.

    코드 숨김 파일이 열립니다. departmentList_SelectedIndexChanged 이벤트 처리기가 코드에 추가되었습니다.

  20. BindingSource 컨트롤의 데이터 소스를 업데이트하는 다음 코드를 departmentList_SelectedIndexChanged 이벤트 처리기에 추가합니다.

    ' Get the selected department object.
    Dim department As Department = CType(Me.departmentList. _
            SelectedItem, Department)
    
    ' Update the data sources for the BindingSource controls.
    onsiteBindingSource.DataSource = department.Courses _
        .OfType(Of OnsiteCourse)()
    onlineBindingSource.DataSource = department.Courses _
        .OfType(Of OnlineCourse)()
    
    // Get the selected department object.
    Department department = (Department)this.departmentList
        .SelectedItem;
    
    // Update the data sources for the BindingSource controls.
    onsiteBindingSource.DataSource = department.Courses.
        OfType<OnsiteCourse>();
    onlineBindingSource.DataSource = department.Courses.
        OfType<OnlineCourse>();
    

이제 응용 프로그램이 완료되었습니다. 응용 프로그램을 실행하려면 Ctrl + F5를 누릅니다. CourseDiscriminator 폼을 로드하려면 Onsite vs. Online 단추를 클릭합니다. 선택한 부서의 OnsiteCoursesOnlineCoursesDataGridView 컨트롤에 표시됩니다.

코드 목록

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

Imports System.Data.Objects
Imports System.Data.Objects.DataClasses
Public Class CourseDiscriminator

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities

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

        ' Define a query that returns all Department objects and 
        ' related Course objects, ordered by name.
        Dim departmentQuery As ObjectQuery(Of Department) = _
            schoolContext.Departments.Include("Courses").OrderBy("it.Name")

        ' Bind the ComboBox control to the query, which is
        ' executed during data binding.
        departmentList.DisplayMember = "Name"
        departmentList.DataSource = departmentQuery. _
            Execute(MergeOption.OverwriteChanges)
    End Sub

    Private Sub departmentList_SelectedIndexChanged(ByVal sender As  _
        System.Object, ByVal e As System.EventArgs) Handles _
        departmentList.SelectedIndexChanged
        ' Get the selected department object.
        Dim department As Department = CType(Me.departmentList. _
                SelectedItem, Department)

        ' Update the data sources for the BindingSource controls.
        onsiteBindingSource.DataSource = department.Courses _
            .OfType(Of OnsiteCourse)()
        onlineBindingSource.DataSource = department.Courses _
            .OfType(Of OnlineCourse)()
    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 CourseDiscriminator : Form
    {
        // Create an ObjectContext instance based on SchoolEntity.
        private SchoolEntities schoolContext;

        public CourseDiscriminator()
        {
            InitializeComponent();
        }

        private void CourseDiscriminator_Load(object sender,
            EventArgs e)
        {
            // Initialize the ObjectContext.
            schoolContext = new SchoolEntities();

            // Define a query that returns all Department objects  
            // and related Course objects, ordered by name.
            ObjectQuery<Department> departmentQuery = 
                schoolContext.Departments.Include("Courses").
                OrderBy("it.Name");

            // Bind the ComboBox control to the query.
            this.departmentList.DisplayMember = "Name";
            this.departmentList.DataSource = departmentQuery.
                Execute(MergeOption.OverwriteChanges);
        }

        private void departmentList_SelectedIndexChanged(object sender,
            EventArgs e)
        {
            // Get the selected department object.
            Department department = (Department)this.departmentList
                .SelectedItem;

            // Update the data sources for the BindingSource controls.
            onsiteBindingSource.DataSource = department.Courses.
                OfType<OnsiteCourse>();
            onlineBindingSource.DataSource = department.Courses.
                OfType<OnlineCourse>();
        }
    }
}

다음 단계

EDM에서 형식당 하나의 테이블 상속을 성공적으로 구현했습니다. 형식당 하나의 테이블 상속을 사용하여 EDM을 정의하는 방법에 대한 자세한 내용은 How to: Define a Model with Table-per-Type Inheritance를 참조하십시오. Entity Framework를 사용하는 응용 프로그램을 빌드하는 방법에 대한 자세한 내용은 Programming Guide (Entity Framework)를 참조하십시오.

참고 항목

기타 리소스

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