쿼리 정의-EF 디자이너Defining Query - EF Designer

이 연습에서는 EF Designer를 사용 하 여 정의 쿼리와 해당 엔터티 형식을 모델에 추가 하는 방법을 보여 줍니다.This walkthrough demonstrates how to add a defining query and a corresponding entity type to a model using the EF Designer. 정의 쿼리는 데이터베이스 뷰에서 제공 하는 것과 유사한 기능을 제공 하는 데 일반적으로 사용 되지만, 뷰는 데이터베이스가 아니라 모델에 정의 됩니다.A defining query is commonly used to provide functionality similar to that provided by a database view, but the view is defined in the model, not the database. 정의 쿼리를 사용 하면 .edmx 파일의 DefiningQuery요소에 지정 된 SQL 문을 실행할 수 있습니다   .A defining query allows you to execute a SQL statement that is specified in the DefiningQuery element of an .edmx file. 자세한 내용은 DefiningQuery In The SSDL Specification를 참조 하세요.For more information, see DefiningQuery in the SSDL Specification.

쿼리 정의를 사용 하는 경우 모델에서 엔터티 형식을 정의 해야 합니다.When using defining queries, you also have to define an entity type in your model. 엔터티 형식은 정의 하는 쿼리에 의해 노출 되는 데이터를 표시 하는 데 사용 됩니다.The entity type is used to surface data exposed by the defining query. 이 엔터티 형식을 통해 표시 되는 데이터는 읽기 전용입니다.Note that data surfaced through this entity type is read-only.

매개 변수가 있는 쿼리를 정의 쿼리로 실행할 수 없습니다.Parameterized queries cannot be executed as defining queries. 그러나 데이터는 저장 프로시저에 데이터를 표시하는 엔터티 형식의 삽입, 업데이트 및 삭제 함수를 매핑하여 업데이트할 수 있습니다.However, the data can be updated by mapping the insert, update, and delete functions of the entity type that surfaces the data to stored procedures. 자세한 내용은 저장 프로시저를 사용 하 여 삽입, 업데이트 및 삭제를 참조 하세요.For more information, see Insert, Update, and Delete with Stored Procedures.

이 항목에서는 다음 작업을 수행 하는 방법을 보여 줍니다.This topic shows how to perform the following tasks.

  • 정의 쿼리 추가Add a Defining Query
  • 모델에 엔터티 형식 추가Add an Entity Type to the Model
  • 정의 쿼리를 엔터티 형식에 매핑Map the Defining Query to the Entity Type

사전 요구 사항Prerequisites

이 연습을 완료하려면 다음 사항이 필요합니다.To complete this walkthrough, you will need:

프로젝트 설정Set up the Project

이 연습에서는 Visual Studio 2012 이상 버전을 사용 합니다.This walkthrough is using Visual Studio 2012 or newer.

  • Visual Studio를 엽니다.Open Visual Studio.
  • 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.On the File menu, point to New, and then click Project.
  • 왼쪽 창에서 **Visual C # **를 클릭 한 다음 콘솔 응용 프로그램 템플릿을 선택 합니다.In the left pane, click Visual C#, and then select the Console Application template.
  • 프로젝트 이름으로 DefiningQuerySample 를 입력 하 고 확인을클릭 합니다.Enter DefiningQuerySample as the name of the project and click OK.

 

School 데이터베이스를 기반으로 모델 만들기Create a Model based on the School Database

  • 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭 하 고 추가를 가리킨 다음 새 항목을 클릭 합니다.Right-click the project name in Solution Explorer, point to Add, and then click New Item.

  • 왼쪽 메뉴에서 데이터 를 선택 하 고 템플릿 창에서 ADO.NET 엔터티 데이터 모델 를 선택 합니다.Select Data from the left menu and then select ADO.NET Entity Data Model in the Templates pane.

  • 파일 이름에 DefiningQueryModel 를 입력 한 다음 추가를 클릭 합니다.Enter DefiningQueryModel.edmx for the file name, and then click Add.

  • Model 콘텐츠 선택 대화 상자에서 데이터베이스에서 생성을 선택 하 고 다음을 클릭 합니다.In the Choose Model Contents dialog box, select Generate from database, and then click Next.

  • 새 연결을 클릭 합니다.Click New Connection. 연결 속성 대화 상자에서 서버 이름 (예: (localdb) \ mssqllocaldb)을 입력 하 고, 인증 방법을 선택 하 고, 데이터베이스 이름으로 School을 입력 한   다음, 확인을 클릭 합니다.In the Connection Properties dialog box, enter the server name (for example, (localdb)\mssqllocaldb), select the authentication method, type School for the database name, and then click OK. 데이터 연결 선택 대화 상자가 데이터베이스 연결 설정으로 업데이트 됩니다.The Choose Your Data Connection dialog box is updated with your database connection setting.

  • 데이터베이스 개체 선택 대화 상자에서 테이블 노드를 선택 합니다 Tables   .In the Choose Your Database Objects dialog box, check the Tables node. 이렇게 하면 모든 테이블이 School 모델에 추가 됩니다.This will add all the tables to the School model.

  •  마침을 클릭 합니다.Click Finish.

  • 솔루션 탐색기에서 DefiningQueryModel 파일을 마우스 오른쪽 단추로 클릭 하 고 연결 프로그램 ... 을 선택 합니다.In Solution Explorer, right-click the DefiningQueryModel.edmx file and select Open With….

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

    XML 편집기

  • 다음 메시지가 표시 되 면 를 클릭 합니다.Click Yes if prompted with the following message:

    경고 2

 

정의 쿼리 추가Add a Defining Query

이 단계에서는 XML 편집기를 사용 하 여 정의 쿼리와 엔터티 형식을 .edmx 파일의 SSDL 섹션에 추가 합니다.In this step we will use the XML Editor to add a defining query and an entity type to the SSDL section of the .edmx file. 

  •  EntitySet   .EDMX 파일의 SSDL 섹션에 EntitySet 요소를 추가 합니다 (5 ~ 13 번 줄).Add an EntitySet element to the SSDL section of the .edmx file (line 5 thru 13). 다음을 지정합니다.Specify the following:
    • EntitySet 요소의 Name   및 EntityType   특성만 EntitySet   지정 됩니다.Only the Name and EntityType attributes of the EntitySet element are specified.
    • 엔터티 형식의 정규화 된 이름은 EntityType특성에 사용 됩니다   .The fully-qualified name of the entity type is used in the EntityType attribute.
    • 실행할 SQL 문은 DefiningQuery요소에 지정 되어   있습니다.The SQL statement to be executed is specified in the DefiningQuery element.
    <!-- 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" />
  • .Edmx의 SSDL 섹션에 EntityType 요소를 추가 합니다.Add the EntityType element to the SSDL section of the .edmx. 파일이 아래와 같이 표시 됩니다.file as shown below. 다음 사항에 유의하세요.Note the following:
    • 이름 특성의 값은 위의 EntitySet 요소에 있는 entitytype 특성의 값에 해당 합니다. 하지만 엔터티 형식의 정규화 된 이름은 entitytype 특성에 사용 됩니다.The value of the Name attribute corresponds to the value of the EntityType attribute in the EntitySet element above, although the fully-qualified name of the entity type is used in the EntityType attribute.
    • 속성 이름은 DefiningQuery 요소의 SQL 문에서 반환 되는 열 이름 (위)에 해당 합니다.The property names correspond to the column names returned by the SQL statement in the DefiningQuery element (above).
    • 이 예제에서 엔터티 키는 고유 키 값을 보장하는 세 개의 속성으로 구성되어 있습니다.In this example, the entity key is composed of three properties to ensure a unique key value.
    <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>

참고

나중에 모델 업데이트 마법사 대화 상자를 실행 하는 경우 쿼리 정의를 비롯 하 여 저장소 모델에 대 한 변경 내용을 덮어씁니다.If later you run the Update Model Wizard dialog, any changes made to the storage model, including defining queries, will be overwritten.

 

모델에 엔터티 형식 추가Add an Entity Type to the Model

이 단계에서는 EF Designer를 사용 하 여 엔터티 형식을 개념적 모델에 추가 합니다.In this step we will add the entity type to the conceptual model using the EF Designer. 다음 사항에 유의하세요. Note the following:

  • 엔터티의 이름은 위의 EntitySet 요소에 있는 EntityType 특성의 값에 해당 합니다.The Name of the entity corresponds to the value of the EntityType attribute in the EntitySet element above.
  • 속성 이름은 위의 DefiningQuery 요소에서 SQL 문에 의해 반환 되는 열 이름에 해당 합니다.The property names correspond to the column names returned by the SQL statement in the DefiningQuery element above.
  • 이 예제에서 엔터티 키는 고유 키 값을 보장하는 세 개의 속성으로 구성되어 있습니다.In this example, the entity key is composed of three properties to ensure a unique key value.

EF 디자이너에서 모델을 엽니다.Open the model in the EF Designer.

  • DefiningQueryModel를 두 번 클릭 합니다.Double-click the DefiningQueryModel.edmx.

  • 를 들어 다음 메시지를 표시 합니다.Say Yes to the following message:

    경고 2

 

모델 편집을 위한 디자인 화면을 제공 하는 Entity Designer 표시 됩니다.The Entity Designer, which provides a design surface for editing your model, is displayed.

  • 디자이너 화면을 마우스 오른쪽 단추로 클릭 하 고 - > 엔터티추가 ...를 선택 합니다.Right-click the designer surface and select Add New->Entity….
  • 엔터티 이름에 GradeReport 을 지정 하 고 키 속성CourseID 를 지정 합니다.Specify GradeReport for the entity name and CourseID for the Key Property.
  • GradeReport 엔터티를 마우스 오른쪽 단추로 클릭 하 고 - > 스칼라 속성추가를 선택 합니다.Right-click the GradeReport entity and select Add New-> Scalar Property.
  • 속성의 기본 이름을 FirstName으로 변경 합니다.Change the default name of the property to FirstName.
  • 다른 스칼라 속성을 추가 하 고 이름에 LastName 을 지정 합니다.Add another scalar property and specify LastName for the name.
  • 다른 스칼라 속성을 추가 하 고 이름에 대해 등급 을 지정 합니다.Add another scalar property and specify Grade for the name.
  • 속성 창에서 등급Type 속성을 Decimal로 변경 합니다.In the Properties window, change the Grade’s Type property to Decimal.
  • FirstNameLastName 속성을 선택 합니다.Select the FirstName and LastName properties.
  • 속성 창에서 EntityKey 속성 값을 True로 변경 합니다.In the Properties window, change the EntityKey property value to True.

따라서 다음 요소가 .edmx 파일의 CSDL 섹션에 추가 되었습니다.As a result, the following elements were added to the CSDL section of the .edmx file.

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

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

 

정의 쿼리를 엔터티 형식에 매핑Map the Defining Query to the Entity Type

이 단계에서는 매핑 정보 창을 사용 하 여 개념 및 저장소 엔터티 형식을 매핑합니다.In this step, we will use the Mapping Details window to map the conceptual and storage entity types.

  • 디자인 화면에서 GradeReport 엔터티를 마우스 오른쪽 단추로 클릭 하 고 테이블 매핑을 선택 합니다.Right-click the GradeReport entity on the design surface and select Table Mapping.
    매핑 정보 창이 표시 됩니다.The Mapping Details window is displayed.
  • 테이블 ** < 또는 뷰 > 추가** 드롭다운 목록에서 GradeReport 를 선택 합니다 ( 테이블s 아래에 있음).Select GradeReport from the <Add a Table or View> dropdown list (located under Tables).
    개념 및 저장소 GradeReport 엔터티 형식 간의 기본 매핑이 표시 됩니다.Default mappings between the conceptual and storage GradeReport entity type appear.
    매핑 Details3Mapping Details3

결과적으로 EntitySetMapping   요소가 .edmx 파일의 매핑 섹션에 추가 됩니다.As a result, the EntitySetMapping element is added to the mapping section of the .edmx file. 

    <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>
  • 애플리케이션을 컴파일합니다.Compile the application.

 

코드에서 정의 쿼리를 호출 합니다.Call the Defining Query in your Code

이제 GradeReport 엔터티 형식을 사용 하 여 정의 쿼리를 실행할 수 있습니다.You can now execute the defining query by using the GradeReport entity type. 

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