다음을 통해 공유


디자이너 테이블 분할

이 연습에서는 EF 디자이너(Entity Framework Designer)를 통해 모델을 수정하여 여러 엔터티 형식을 단일 테이블에 매핑하는 방법을 보여줍니다.

테이블 분할을 사용할 수 있는 한 가지 이유는 지연 로드를 통해 개체를 로드할 때 일부 속성의 로드가 지연되기 때문입니다. 매우 많은 양의 데이터를 포함할 수 있는 속성을 별도의 엔터티로 분리하고 필요한 경우에만 로드할 수 있습니다.

다음 이미지는 EF 디자이너로 작업할 때 사용되는 기본 창을 보여줍니다.

EF Designer

필수 조건

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

Project 설정

이 연습에서는 Visual Studio 2012를 사용합니다.

  • Visual Studio 2012를 엽니다.
  • 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
  • 왼쪽 창에서 Visual C#을 클릭한 다음 콘솔 애플리케이션 템플릿을 선택합니다.
  • 프로젝트 이름으로 TableSplittingSample을 입력하고 확인을 클릭합니다.

School Database를 기반으로 모델 만들기

  • 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목을 클릭합니다.
  • 왼쪽 메뉴에서 데이터를 선택한 다음 템플릿 창에서 ADO.NET 엔터티 데이터 모델을 선택합니다.
  • 모델 이름에 TableSplittingModel.edmx를 입력하고 추가를 클릭합니다.
  • 모델 콘텐츠 선택 대화 상자에서 데이터베이스에서 생성을 선택한 후 다음을 클릭합니다.
  • 새 연결을 클릭합니다. 연결 속성 대화 상자에서 서버 이름(예: (localdb)\mssqllocaldb)을 입력하고 인증 방법을 선택하고 데이터베이스 이름에 School을 입력한 다음 확인을 클릭합니다. 데이터 연결 선택 대화 상자가 데이터베이스 연결 설정으로 업데이트됩니다.
  • 데이터베이스 개체 선택 대화 상자에서 테이블 노드를 펼치고 Person 테이블을 선택합니다. 그러면 지정된 테이블이 School 모델에 추가됩니다.
  • Finish를 클릭합니다.

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

단일 테이블에 두 엔터티 매핑

이 섹션에서는 Person 엔터티를 두 엔터티로 분할한 다음 단일 테이블에 매핑합니다.

참고 항목

Person 엔터티에는 많은 양의 데이터를 포함할 수 있는 속성이 없으며, 이는 예제로만 사용됩니다.

  • 디자인 화면의 빈 영역을 마우스 오른쪽 단추로 클릭하고 새로 추가를 가리킨 후 엔터티를 클릭합니다. 새 엔터티 대화 상자가 나타납니다.
  • 엔터티 이름HireInfo를 입력하고 키 속성 이름에 PersonID를 입력합니다.
  • 확인을 클릭합니다.
  • 새 엔터티 형식이 만들어져 디자인 화면에 표시됩니다.
  • Person 엔터티 형식의 HireDate 속성을 선택하고 Ctrl+X 키를 누릅니다.
  • HireInfo 엔터티를 선택하고 Ctrl+V 키를 누릅니다.
  • PersonHireInfo 간의 연결을 만듭니다. 이를 수행하려면 디자인 화면의 빈 영역을 마우스 오른쪽 단추로 클릭하고 새로 추가를 가리킨 다음 연결을 클릭합니다.
  • 연결 추가 대화 상자가 나타납니다. PersonHireInfo 이름은 기본적으로 지정됩니다.
  • 관계의 양쪽 끝에 다중성 1(하나)을 지정합니다.
  • 확인을 누릅니다.

다음 단계에서는 매핑 세부 정보 창이 필요합니다. 이 창이 표시되지 않으면 디자인 화면을 마우스 오른쪽 단추로 클릭하고 매핑 세부 정보를 선택합니다.

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

  • <테이블 또는 뷰 추가> 필드 드롭다운 목록에서 Person을 선택합니다. 목록에 선택한 엔터티를 매핑할 수 있는 테이블 또는 뷰가 포함됩니다. 적절한 속성은 기본적으로 매핑되어야 합니다.

    Mapping Properties

  • 디자인 화면에서 PersonHireInfo 연결을 선택합니다.

  • 디자인 화면에서 연결을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

  • 속성 창에서 참조 제약 조건 속성을 선택하고 타원 단추를 클릭합니다.

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

  • 확인을 누릅니다.

 

모델 사용

  • Main 메서드에 다음 코드를 붙여넣습니다.
    using (var context = new SchoolEntities())
    {
        Person person = new Person()
        {
            FirstName = "Kimberly",
            LastName = "Morgan",
            Discriminator = "Instructor",
        };

        person.HireInfo = new HireInfo()
        {
            HireDate = DateTime.Now
        };

        // Add the new person to the context.
        context.People.Add(person);

        // Insert a row into the Person table.  
        context.SaveChanges();

        // Execute a query against the Person table.
        // The query returns columns that map to the Person entity.
        var existingPerson = context.People.FirstOrDefault();

        // Execute a query against the Person table.
        // The query returns columns that map to the Instructor entity.
        var hireInfo = existingPerson.HireInfo;

        Console.WriteLine("{0} was hired on {1}",
            existingPerson.LastName, hireInfo.HireDate);
    }
  • 애플리케이션을 컴파일하고 실행합니다.

다음 T-SQL 문은 이 애플리케이션을 실행한 결과로 School 데이터베이스에 대해 실행되었습니다. 

  • 다음 INSERT는 context.SaveChanges() 실행의 결과로 실행되었으며, PersonHireInfo 엔터티의 데이터를 결합합니다.

    Insert Combining Person and HireInfo Data

  • 다음 SELECT는 context.People.FirstOrDefault() 실행의 결과로 실행되었으며, Person에 매핑된 열만 선택합니다.

    Select 1

  • 다음 SELECT는 existingPerson.Instructor 탐색 속성에 액세스한 결과로 실행되었으며, HireInfo에 매핑된 열만 선택합니다.

    Select 2