다음을 통해 공유


정의 쿼리 - EF Designer

이 연습에서는 EF Designer를 사용하여 정의 쿼리 및 해당 엔터티 형식을 모델에 추가하는 방법을 보여 줍니다. 일반적으로 정의 쿼리는 데이터베이스 뷰에서 제공하는 기능과 유사한 기능을 제공하는 데 사용되지만 뷰는 데이터베이스가 아닌 모델에 정의됩니다. 정의 쿼리를 통해 .edmx 파일의 DefiningQuery 요소에 지정된 SQL 문을 실행할 수 있습니다. 자세한 내용은 SSDL 사양DefiningQuery를 참조하세요.

정의 쿼리를 사용하는 경우 모델에서 엔터티 형식도 정의해야 합니다. 엔터티 형식은 정의 쿼리로 노출되는 데이터를 표시하는 데 사용됩니다. 엔터티 형식을 통해 표시되는 데이터는 읽기 전용입니다.

매개 변수가 있는 쿼리를 정의 쿼리로 실행할 수 없습니다. 그러나 데이터는 저장 프로시저에 데이터를 표시하는 엔터티 형식의 삽입, 업데이트 및 삭제 함수를 매핑하여 업데이트할 수 있습니다. 자세한 내용은 저장 프로시저를 사용하여 삽입, 업데이트 및 삭제를 참조하세요.

이 항목에서는 다음 작업을 수행하는 방법을 보여 줍니다.

  • 정의 쿼리 추가
  • 모델에 엔터티 형식 추가
  • 정의 쿼리를 엔터티 형식에 매핑

필수 조건

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

Project 설정

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

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

 

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

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

  • 왼쪽 메뉴에서 데이터를 선택한 다음 템플릿 창에서 ADO.NET 엔터티 데이터 모델을 선택합니다.

  • 파일 이름으로 DefiningQueryModel.edmx를 입력하고 추가를 클릭합니다.

  • 모델 콘텐츠 선택 대화 상자에서 데이터베이스에서 생성을 선택한 후 다음을 클릭합니다.

  • 새 연결을 클릭합니다. 연결 속성 대화 상자에서 서버 이름(예: (localdb)\mssqllocaldb)을 입력하고 인증 방법을 선택하고 데이터베이스 이름에 School을 입력한 다음 확인을 클릭합니다. 데이터 연결 선택 대화 상자가 데이터베이스 연결 설정으로 업데이트됩니다.

  • 데이터베이스 개체 선택 대화 상자에서 Tables 노드를 선택합니다. 그러면 모든 테이블이 School 모델에 추가됩니다.

  • Finish를 클릭합니다.

  • 솔루션 탐색기에서 DefiningQueryModel.edmx 파일을 마우스 오른쪽 단추로 클릭하고 다른 프로그램으로 열기...를 선택합니다.

  • XML(텍스트) 편집기를 선택합니다.

    XML Editor

  • 다음 메시지가 표시되면 를 클릭합니다.

    Warning 2

 

정의 쿼리 추가

이 단계에서는 XML 편집기를 사용하여 .edmx 파일의 SSDL 섹션에 정의 쿼리 및 엔터티 형식을 추가합니다. 

  • .edmx 파일의 SSDL 섹션에 EntitySet 요소를 추가합니다(줄 5~13). 다음을 명시합니다.
    • EntitySet 요소의 NameEntityType 특성만 지정됩니다.
    • 엔터티 형식의 정규화된 이름은 EntityType 특성에 사용됩니다.
    • 실행할 SQL 문은 DefiningQuery 요소에 지정됩니다.
    <!-- SSDL content -->
    <edmx:StorageModels>
      <Schema Namespace="SchoolModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/11/edm/ssdl">
        <EntityContainer Name="SchoolModelStoreContainer">
           <EntitySet Name="GradeReport" EntityType="SchoolModel.Store.GradeReport">
              <DefiningQuery>
                SELECT CourseID, Grade, FirstName, LastName
                FROM StudentGrade
                JOIN
                (SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
                ON StudentID = p.PersonID
              </DefiningQuery>
          </EntitySet>
          <EntitySet Name="Course" EntityType="SchoolModel.Store.Course" store:Type="Tables" Schema="dbo" />
  • 아래와 같이 EntityType 요소를 .edmx의 SSDL 섹션에 추가합니다. 다음을 참고하세요.
    • 엔터티 형식의 정규화된 이름은 EntityType 특성에서 사용되지만 Name 특성의 값은 위 EntitySet 요소에 있는 EntityType 특성의 값과 일치합니다.
    • 속성 이름은 위 DefiningQuery 요소의 SQL 문에서 반환되는 열 이름과 일치합니다.
    • 이 예제에서 엔터티 키는 고유 키 값을 보장하는 세 개의 속성으로 구성되어 있습니다.
    <EntityType Name="GradeReport">
      <Key>
        <PropertyRef Name="CourseID" />
        <PropertyRef Name="FirstName" />
        <PropertyRef Name="LastName" />
      </Key>
      <Property Name="CourseID"
                Type="int"
                Nullable="false" />
      <Property Name="Grade"
                Type="decimal"
                Precision="3"
                Scale="2" />
      <Property Name="FirstName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
      <Property Name="LastName"
                Type="nvarchar"
                Nullable="false"
                MaxLength="50" />
    </EntityType>

참고 항목

나중에 모델 업데이트 마법사 대화 상자를 실행하면 정의 쿼리를 포함하여 스토리지 모델에 대한 모든 변경 내용을 덮어씁니다.

 

모델에 엔터티 형식 추가

이 단계에서는 EF Designer를 사용하여 개념적 모델에 엔터티 형식을 추가합니다.  다음을 참고하십시오.

  • 엔터티의 Name은 위의 EntitySet 요소에 있는 EntityType 특성의 값과 일치합니다.
  • 속성 이름은 위 DefiningQuery 요소의 SQL 문에서 반환되는 열 이름과 일치합니다.
  • 이 예제에서 엔터티 키는 고유 키 값을 보장하는 세 개의 속성으로 구성되어 있습니다.

EF Designer에서 모델을 엽니다.

  • DefiningQueryModel.edmx를 두 번 클릭합니다.

  • 다음 메시지에 를 선택합니다.

    Warning 2

 

모델 편집을 위한 디자인 화면을 제공하는 Entity Designer가 표시됩니다.

  • 디자이너 화면을 마우스 오른쪽 단추로 클릭하고 새로 추가 -> 엔터티…를 선택합니다.
  • 엔터티 이름에 GradeReport를 지정하고 키 속성CourseID를 지정합니다.
  • GradeReport 엔터티를 마우스 오른쪽 단추로 클릭하고 새로 추가 -> 스칼라 속성을 선택합니다.
  • 속성의 기본 이름을 FirstName으로 변경합니다.
  • 다른 스칼라 속성을 추가하고 이름의 LastName을 지정합니다.
  • 다른 스칼라 속성을 추가하고 이름의 Grade를 지정합니다.
  • 속성 창에서 GradeType 속성을 Decimal로 변경합니다.
  • FirstNameLastName 속성을 선택합니다.
  • 속성 창에서 EntityKey 속성을 True로 변경합니다.

결과적으로 다음 요소가 .edmx 파일의 CSDL 섹션에 추가되었습니다.

    <EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />

    <EntityType Name="GradeReport">
    . . .
    </EntityType>

 

정의 쿼리를 엔터티 형식에 매핑

이 단계에서는 매핑 세부 정보 창을 사용하여 개념적 및 스토리지 엔터티 형식을 매핑합니다.

  • 디자인 화면에서 GradeReport 엔터티를 마우스 오른쪽 단추로 클릭하고 테이블 매핑을 선택합니다.
    매핑 세부 정보 창이 표시됩니다.
  • 테이블에 있는 <테이블 또는 뷰 추가> 드롭다운 목록에서 GradeReport를 선택합니다.
    개념적 및 스토리지 GradeReport 엔터티 형식 간의 기본 매핑이 나타납니다.
    Mapping Details3

결과적으로 EntitySetMapping 요소가 .edmx 파일의 매핑 섹션에 추가됩니다. 

    <EntitySetMapping Name="GradeReports">
      <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
        <MappingFragment StoreEntitySet="GradeReport">
          <ScalarProperty Name="LastName" ColumnName="LastName" />
          <ScalarProperty Name="FirstName" ColumnName="FirstName" />
          <ScalarProperty Name="Grade" ColumnName="Grade" />
          <ScalarProperty Name="CourseID" ColumnName="CourseID" />
        </MappingFragment>
      </EntityTypeMapping>
    </EntitySetMapping>
  • 애플리케이션을 컴파일합니다.

 

코드에서 정의 쿼리 호출

이제 GradeReport 엔터티 형식을 사용하여 정의 쿼리를 실행할 수 있습니다. 

    using (var context = new SchoolEntities())
    {
        var report = context.GradeReports.FirstOrDefault();
        Console.WriteLine("{0} {1} got {2}",
            report.FirstName, report.LastName, report.Grade);
    }