디자이너 테이블 분할
이 연습에서는 EF 디자이너(Entity Framework Designer)를 통해 모델을 수정하여 여러 엔터티 형식을 단일 테이블에 매핑하는 방법을 보여줍니다.
테이블 분할을 사용할 수 있는 한 가지 이유는 지연 로드를 통해 개체를 로드할 때 일부 속성의 로드가 지연되기 때문입니다. 매우 많은 양의 데이터를 포함할 수 있는 속성을 별도의 엔터티로 분리하고 필요한 경우에만 로드할 수 있습니다.
다음 이미지는 EF 디자이너로 작업할 때 사용되는 기본 창을 보여줍니다.
필수 조건
이 연습을 완료하려면 다음 사항이 필요합니다.
- Visual Studio의 최신 버전.
- School 샘플 데이터베이스.
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 키를 누릅니다.
- Person과 HireInfo 간의 연결을 만듭니다. 이를 수행하려면 디자인 화면의 빈 영역을 마우스 오른쪽 단추로 클릭하고 새로 추가를 가리킨 다음 연결을 클릭합니다.
- 연결 추가 대화 상자가 나타납니다. PersonHireInfo 이름은 기본적으로 지정됩니다.
- 관계의 양쪽 끝에 다중성 1(하나)을 지정합니다.
- 확인을 누릅니다.
다음 단계에서는 매핑 세부 정보 창이 필요합니다. 이 창이 표시되지 않으면 디자인 화면을 마우스 오른쪽 단추로 클릭하고 매핑 세부 정보를 선택합니다.
HireInfo 엔터티 형식을 선택하고 매핑 세부 정보 창에서 <테이블 또는 뷰 추가>를 클릭합니다.
<테이블 또는 뷰 추가> 필드 드롭다운 목록에서 Person을 선택합니다. 목록에 선택한 엔터티를 매핑할 수 있는 테이블 또는 뷰가 포함됩니다. 적절한 속성은 기본적으로 매핑되어야 합니다.
디자인 화면에서 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() 실행의 결과로 실행되었으며, Person 및 HireInfo 엔터티의 데이터를 결합합니다.
다음 SELECT는 context.People.FirstOrDefault() 실행의 결과로 실행되었으며, Person에 매핑된 열만 선택합니다.
다음 SELECT는 existingPerson.Instructor 탐색 속성에 액세스한 결과로 실행되었으며, HireInfo에 매핑된 열만 선택합니다.
.NET