정의 쿼리 - EF Designer
이 연습에서는 EF Designer를 사용하여 정의 쿼리 및 해당 엔터티 형식을 모델에 추가하는 방법을 보여 줍니다. 일반적으로 정의 쿼리는 데이터베이스 뷰에서 제공하는 기능과 유사한 기능을 제공하는 데 사용되지만 뷰는 데이터베이스가 아닌 모델에 정의됩니다. 정의 쿼리를 통해 .edmx 파일의 DefiningQuery 요소에 지정된 SQL 문을 실행할 수 있습니다. 자세한 내용은 SSDL 사양의 DefiningQuery를 참조하세요.
정의 쿼리를 사용하는 경우 모델에서 엔터티 형식도 정의해야 합니다. 엔터티 형식은 정의 쿼리로 노출되는 데이터를 표시하는 데 사용됩니다. 엔터티 형식을 통해 표시되는 데이터는 읽기 전용입니다.
매개 변수가 있는 쿼리를 정의 쿼리로 실행할 수 없습니다. 그러나 데이터는 저장 프로시저에 데이터를 표시하는 엔터티 형식의 삽입, 업데이트 및 삭제 함수를 매핑하여 업데이트할 수 있습니다. 자세한 내용은 저장 프로시저를 사용하여 삽입, 업데이트 및 삭제를 참조하세요.
이 항목에서는 다음 작업을 수행하는 방법을 보여 줍니다.
- 정의 쿼리 추가
- 모델에 엔터티 형식 추가
- 정의 쿼리를 엔터티 형식에 매핑
필수 조건
이 연습을 완료하려면 다음 사항이 필요합니다.
- 최신 버전의 Visual Studio
- School 샘플 데이터베이스
Project 설정
이 연습에서는 Visual Studio 2012 이상을 사용합니다.
- Visual Studio를 엽니다.
- 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
- 왼쪽 창에서 Visual C#을 클릭한 다음 콘솔 애플리케이션 템플릿을 선택합니다.
- 프로젝트 이름으로 DefiningQuerySample을 입력하고 확인을 클릭합니다.
School 데이터베이스를 기반으로 모델 만들기
솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목을 클릭합니다.
왼쪽 메뉴에서 데이터를 선택한 다음 템플릿 창에서 ADO.NET 엔터티 데이터 모델을 선택합니다.
파일 이름으로 DefiningQueryModel.edmx를 입력하고 추가를 클릭합니다.
모델 콘텐츠 선택 대화 상자에서 데이터베이스에서 생성을 선택한 후 다음을 클릭합니다.
새 연결을 클릭합니다. 연결 속성 대화 상자에서 서버 이름(예: (localdb)\mssqllocaldb)을 입력하고 인증 방법을 선택하고 데이터베이스 이름에 School을 입력한 다음 확인을 클릭합니다. 데이터 연결 선택 대화 상자가 데이터베이스 연결 설정으로 업데이트됩니다.
데이터베이스 개체 선택 대화 상자에서 Tables 노드를 선택합니다. 그러면 모든 테이블이 School 모델에 추가됩니다.
Finish를 클릭합니다.
솔루션 탐색기에서 DefiningQueryModel.edmx 파일을 마우스 오른쪽 단추로 클릭하고 다른 프로그램으로 열기...를 선택합니다.
XML(텍스트) 편집기를 선택합니다.
다음 메시지가 표시되면 예를 클릭합니다.
정의 쿼리 추가
이 단계에서는 XML 편집기를 사용하여 .edmx 파일의 SSDL 섹션에 정의 쿼리 및 엔터티 형식을 추가합니다.
- .edmx 파일의 SSDL 섹션에 EntitySet 요소를 추가합니다(줄 5~13). 다음을 명시합니다.
- EntitySet 요소의 Name 및 EntityType 특성만 지정됩니다.
- 엔터티 형식의 정규화된 이름은 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를 두 번 클릭합니다.
다음 메시지에 예를 선택합니다.
모델 편집을 위한 디자인 화면을 제공하는 Entity Designer가 표시됩니다.
- 디자이너 화면을 마우스 오른쪽 단추로 클릭하고 새로 추가 -> 엔터티…를 선택합니다.
- 엔터티 이름에 GradeReport를 지정하고 키 속성에 CourseID를 지정합니다.
- GradeReport 엔터티를 마우스 오른쪽 단추로 클릭하고 새로 추가 -> 스칼라 속성을 선택합니다.
- 속성의 기본 이름을 FirstName으로 변경합니다.
- 다른 스칼라 속성을 추가하고 이름의 LastName을 지정합니다.
- 다른 스칼라 속성을 추가하고 이름의 Grade를 지정합니다.
- 속성 창에서 Grade의 Type 속성을 Decimal로 변경합니다.
- FirstName 및 LastName 속성을 선택합니다.
- 속성 창에서 EntityKey 속성을 True로 변경합니다.
결과적으로 다음 요소가 .edmx 파일의 CSDL 섹션에 추가되었습니다.
<EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />
<EntityType Name="GradeReport">
. . .
</EntityType>
정의 쿼리를 엔터티 형식에 매핑
이 단계에서는 매핑 세부 정보 창을 사용하여 개념적 및 스토리지 엔터티 형식을 매핑합니다.
- 디자인 화면에서 GradeReport 엔터티를 마우스 오른쪽 단추로 클릭하고 테이블 매핑을 선택합니다.
매핑 세부 정보 창이 표시됩니다. - 테이블에 있는 <테이블 또는 뷰 추가> 드롭다운 목록에서 GradeReport를 선택합니다.
개념적 및 스토리지 GradeReport 엔터티 형식 간의 기본 매핑이 나타납니다.
결과적으로 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);
}
.NET