다음을 통해 공유


디자이너 TPT 상속

이 단계별 연습에서는 EF 디자이너(Entity Framework Designer)를 사용하여 모델에서 TPT(형식당 하나의 테이블) 상속을 구현하는 방법을 보여줍니다. 형식당 하나의 테이블 상속에서는 데이터베이스의 별도 테이블을 사용하여 상속 계층 구조에 있는 각 형식의 상속되지 않는 속성 및 키 속성 데이터를 유지합니다.

이 연습에서는 Course(기본 형식), OnlineCourse(Course에서 파생) 및 OnsiteCourse(Course에서 파생) 엔터티를 동일한 이름의 테이블에 매핑합니다. 데이터베이스에서 모델을 만든 다음 모델을 변경하여 TPT 상속을 구현합니다.

Model First로 시작한 다음 모델에서 데이터베이스를 생성할 수도 있습니다. EF 디자이너는 기본적으로 TPT 전략을 사용하므로 모델의 상속은 별도의 테이블에 매핑됩니다.

기타 상속 옵션

TPH(계층당 하나의 테이블)는 상속 계층 구조의 모든 엔터티 형식에 대한 데이터를 유지 관리하는 데 하나의 데이터베이스 테이블을 사용하는 또 다른 상속 유형입니다.  Entity Designer를 사용하여 계층당 하나의 테이블을 매핑하는 방법에 대한 자세한 내용은 EF 디자이너 TPH 상속을 참조하세요. 

TPC(구체적 형식당 테이블) 상속 및 혼합 상속 모델은 Entity Framework 런타임에서 지원되지만 EF 디자이너에서는 지원되지 않습니다. TPC 또는 혼합 상속을 사용하려면 Code First를 사용하거나 EDMX 파일을 수동으로 편집하는 두 가지 옵션이 있습니다. EDMX 파일로 작업하도록 선택하면 매핑 세부 정보 창이 "안전 모드"로 전환되고 디자이너를 사용하여 매핑을 변경할 수 없습니다.

필수 조건

이 연습을 완료하려면 다음 사항이 필요합니다.

Project 설정

  • Visual Studio 2012를 엽니다.
  • 파일-> 새로 만들기 -> 프로젝트를 선택합니다.
  • 왼쪽 창에서 Visual C#을 클릭한 다음 콘솔 템플릿을 선택합니다.
  • 이름으로 TPTDBFirstSample을 입력합니다.
  • 확인을 선택합니다.

모델 만들기

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가 -> 새 항목을 차례로 선택합니다.
  • 왼쪽 메뉴에서 데이터를 선택한 다음 템플릿 창에서 ADO.NET 엔터티 데이터 모델을 선택합니다.
  • 파일 이름에 TPTModel.edmx를 입력하고 추가를 클릭합니다.
  • 모델 콘텐츠 선택 대화 상자에서 **데이터베이스에서 생성**을 선택한 후 다음을 클릭합니다.
  • 새 연결을 클릭합니다. 연결 속성 대화 상자에서 서버 이름(예: (localdb)\mssqllocaldb)을 입력하고 인증 방법을 선택하고 데이터베이스 이름에 School을 입력한 다음 확인을 클릭합니다. 데이터 연결 선택 대화 상자가 데이터베이스 연결 설정으로 업데이트됩니다.
  • 데이터베이스 개체 선택 대화 상자의 테이블 노드 아래에서 Department, Course, OnlineCourse 및 OnsiteCourse 테이블을 선택합니다.
  • Finish를 클릭합니다.

모델을 편집하기 위한 디자인 화면을 제공하는 엔터티 디자이너가 표시됩니다. 데이터베이스 개체 선택 대화 상자에서 선택한 모든 개체가 모델에 추가됩니다.

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

  • 디자인 화면에서 OnlineCourse 엔터티 형식을 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다.
  • 속성 창에서 기본 형식 속성을 Course로 설정합니다.
  • OnlineCourse 엔터티 형식을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
  • 속성 창에서 기본 형식 속성을 Course로 설정합니다.
  • OnlineCourseCourse 엔터티 형식 간의 연결(선)을 마우스 오른쪽 단추로 클릭합니다. 모델에서 삭제를 선택합니다.
  • OnsiteCourseCourse 엔터티 형식 간의 연결을 마우스 오른쪽 단추로 클릭합니다. 모델에서 삭제를 선택합니다.

이제 이러한 클래스가 Course 기본 형식에서 CourseID를 상속하기 때문 OnlineCourseOnsiteCourse에서 CourseID 속성을 삭제합니다.

  • OnlineCourse 엔터티 형식의 CourseID 속성을 마우스 오른쪽 단추로 클릭한 다음 모델에서 삭제를 선택합니다.
  • OnsiteCourse 엔터티 형식의 CourseID 속성을 마우스 오른쪽 단추로 클릭한 다음 모델에서 삭제를 선택합니다.
  • 이제 형식당 하나의 테이블 상속이 구현되었습니다.

Table Per Type

모델 사용

Main 메서드가 정의된 Program.cs 파일을 엽니다. 다음 코드를 Main 함수에 붙여 넣습니다. 이 코드는 세 개의 쿼리를 실행합니다. 첫 번째 쿼리는 지정된 부서와 관련된 모든 Courses를 다시 가져옵니다. 두 번째 쿼리는 OfType 메서드를 사용하여 지정된 부서와 관련된 OnlineCourses를 반환합니다. 세 번째 쿼리는 OnsiteCourses를 반환합니다.

    using (var context = new SchoolEntities())
    {
        foreach (var department in context.Departments)
        {
            Console.WriteLine("The {0} department has the following courses:",
                               department.Name);

            Console.WriteLine("   All courses");
            foreach (var course in department.Courses )
            {
                Console.WriteLine("     {0}", course.Title);
            }

            foreach (var course in department.Courses.
                OfType<OnlineCourse>())
            {
                Console.WriteLine("   Online - {0}", course.Title);
            }

            foreach (var course in department.Courses.
                OfType<OnsiteCourse>())
            {
                Console.WriteLine("   Onsite - {0}", course.Title);
            }
        }
    }