다음을 통해 공유


디자이너 엔터티 분할

이 연습에서는 EF 디자이너(Entity Framework Designer)를 통해 모델을 수정하여 엔터티 형식을 두 테이블에 매핑하는 방법을 보여줍니다. 테이블이 공통 키를 공유하는 경우 한 엔터티를 여러 테이블에 매핑할 수 있습니다. 두 테이블에 한 엔터티 형식 매핑에 적용되는 개념은 셋 이상의 테이블에 한 엔터티 형식 매핑으로까지 쉽게 확장됩니다.

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

EF Designer

필수 조건

Visual Studio 2012 또는 Visual Studio 2010, Ultimate, Premium, Professional 또는 Web Express Edition이 이에 해당합니다.

데이터베이스 만들기

Visual Studio와 함께 설치되는 데이터베이스 서버는 설치한 Visual Studio 버전에 따라 다릅니다.

  • Visual Studio 2012를 사용하는 경우 LocalDB 데이터베이스를 만듭니다.
  • Visual Studio 2010을 사용하는 경우 SQL Express 데이터베이스를 만듭니다.

먼저 단일 엔터티로 결합할 두 개의 테이블이 있는 데이터베이스를 만듭니다.

  • Visual Studio를 엽니다.
  • 보기 -> 서버 탐색기
  • 데이터 연결 -> 연결 추가...를 마우스 오른쪽 단추로 클릭합니다.
  • 서버 탐색기에서 데이터베이스에 연결하지 않은 경우 Microsoft SQL Server를 데이터 원본으로 선택해야 합니다.
  • 설치한 항목에 따라 LocalDB 또는 SQL Express에 연결합니다.
  • EntitySplitting을 데이터베이스 이름으로 입력합니다.
  • 확인을 선택하여 새 데이터베이스를 만들 것인지 묻는 메시지가 표시되면 를 선택합니다.
  • 이제 새 데이터베이스가 서버 탐색기에 표시됩니다.
  • Visual Studio 2012를 사용하는 경우
    • 서버 탐색기에서 데이터베이스를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택합니다.
    • 다음 SQL을 새 쿼리에 복사한 다음 쿼리를 마우스 오른쪽 단추로 클릭하고 실행을 선택합니다.
  • Visual Studio 2010을 사용하는 경우
    • 데이터 -> Transact SQL 편집기 -> 새 쿼리 연결...을 선택합니다.
    • 서버 이름으로 .\SQLEXPRESS를 입력하고 확인을 클릭합니다.
    • 쿼리 편집기의 맨 위에 있는 드롭다운에서 EntitySplitting 데이터베이스를 선택합니다.
    • 다음 SQL을 새 쿼리에 복사한 다음 쿼리를 마우스 오른쪽 단추로 클릭하고 SQL 실행을 선택합니다.
CREATE TABLE [dbo].[Person] (
[PersonId] INT IDENTITY (1, 1) NOT NULL,
[FirstName] NVARCHAR (200) NULL,
[LastName] NVARCHAR (200) NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonId] ASC)
);

CREATE TABLE [dbo].[PersonInfo] (
[PersonId] INT NOT NULL,
[Email] NVARCHAR (200) NULL,
[Phone] NVARCHAR (50) NULL,
CONSTRAINT [PK_PersonInfo] PRIMARY KEY CLUSTERED ([PersonId] ASC),
CONSTRAINT [FK_Person_PersonInfo] FOREIGN KEY ([PersonId]) REFERENCES [dbo].[Person] ([PersonId]) ON DELETE CASCADE
);

프로젝트 만들기

  • 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
  • 왼쪽 창에서 Visual C#을 클릭한 다음 콘솔 애플리케이션 템플릿을 선택합니다.
  • MapEntityToTablesSample을 프로젝트 이름으로 입력하고 확인을 클릭합니다.
  • 첫 번째 섹션에서 만든 SQL 쿼리를 저장할 것인지 묻는 메시지가 표시되면 아니요를 클릭합니다.

데이터베이스를 기반으로 모델 만들기

  • 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목을 클릭합니다.
  • 왼쪽 메뉴에서 데이터를 선택한 다음 템플릿 창에서 ADO.NET 엔터티 데이터 모델을 선택합니다.
  • 파일 이름에 MapEntityToTablesModel.edmx를 입력하고 추가를 클릭합니다.
  • 모델 콘텐츠 선택 대화 상자에서 데이터베이스에서 생성을 선택한 후 다음을 클릭합니다.
  • 드롭다운에서 EntitySplitting 연결을 선택하고 다음을 클릭합니다.
  • 데이터베이스 개체 선택 대화 상자에서 테이블 노드 옆에 있는 확인란을 선택합니다. 그러면 EntitySplitting 데이터베이스의 모든 테이블이 모델에 추가됩니다.
  • Finish를 클릭합니다.

모델을 편집하기 위한 디자인 화면을 제공하는 엔터티 디자이너가 표시됩니다.

엔터티를 두 테이블에 매핑

이 단계에서는 PersonPersonInfo 테이블의 데이터를 결합하도록 Person 엔터티 형식을 업데이트합니다.

  • **PersonInfo**엔터티의 EmailPhone 속성을 선택하고 Ctrl+X 키를 누릅니다.

  • **Person**엔터티를 선택하고 Ctrl+V 키를 누릅니다.

  • 디자인 화면에서 PersonInfo 엔터티를 선택하고 키보드에서 삭제 단추를 누릅니다.

  • 모델에서 PersonInfo 테이블을 제거할 것인지 묻는 메시지가 표시되면 아니요를 클릭합니다. 우리는 이 테이블을 Person 엔터티에 매핑합니다.

    Delete Tables

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

  • Person 엔터티 형식을 선택하고 매핑 세부 정보 창에서 <테이블 또는 뷰 추가>를 클릭합니다.
  • 드롭다운 목록에서 **PersonInfo **를 선택합니다. 매핑 세부 정보 창은 기본 열 매핑으로 업데이트되며, 이는 우리 시나리오에 적합합니다.

이제 Person 엔터티 형식이 PersonPersonInfo 테이블에 매핑됩니다.

Mapping 2

모델 사용

  • Main 메서드에 다음 코드를 붙여넣습니다.
    using (var context = new EntitySplittingEntities())
    {
        var person = new Person
        {
            FirstName = "John",
            LastName = "Doe",
            Email = "john@example.com",
            Phone = "555-555-5555"
        };

        context.People.Add(person);
        context.SaveChanges();

        foreach (var item in context.People)
        {
            Console.WriteLine(item.FirstName);
        }
    }
  • 애플리케이션을 컴파일하고 실행합니다.

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

  • 다음 두 INSERT 문은 context.SaveChanges() 실행의 결과로 실행되었습니다. Person 엔터티에서 데이터를 가져와 PersonPersonInfo 테이블 간에 분할합니다.

    Insert 1

    Insert 2

  • 다음 SELECT는 데이터베이스에 있는 사용자를 열거한 결과로 실행되었습니다. PersonPersonInfo 테이블의 데이터를 결합합니다.

    Select Combining Person and PersonInfo Data