다음을 통해 공유


디자이너 쿼리 저장 프로시저

이 단계별 연습에서는 EF 디자이너(Entity Framework Designer)를 사용하여 저장 프로시저를 모델로 가져온 다음 가져온 저장 프로시저를 호출하여 결과를 검색하는 방법을 보여줍니다.

Code First는 저장 프로시저 또는 함수에 대한 매핑을 지원하지 않습니다. 그러나 System.Data.Entity.DbSet.SqlQuery 메서드를 사용하여 저장 프로시저 또는 함수를 호출할 수 있습니다. 예시:

var query = context.Products.SqlQuery("EXECUTE [dbo].[GetAllProducts]")`;

필수 조건

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

Project 설정

  • Visual Studio 2012를 엽니다.
  • 파일-> 새로 만들기 -> 프로젝트를 선택합니다.
  • 왼쪽 창에서 Visual C#을 클릭한 다음 콘솔 템플릿을 선택합니다.
  • 이름으로 EFwithSProcsSample을 입력합니다.
  • 확인을 선택합니다.

모델 만들기

  • 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가 -> 새 항목을 차례로 선택합니다.

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

  • 모델 이름에 EFwithSProcsModel.edmx를 입력하고 추가를 클릭합니다.

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

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

  • 데이터베이스 개체 선택 대화 상자에서 테이블 확인란을 선택하여 모든 테이블을 선택합니다.
    또한 저장 프로시저 및 함수 노드: GetStudentGradesGetDepartmentName에서 저장 프로시저를 선택합니다.

    저장 프로시저 가져오기

    Visual Studio 2012부터 EF 디자이너는 저장 프로시저의 일괄 가져오기를 지원합니다. 선택한 저장 프로시저 및 함수를 엔터티 모델로 가져오기는 기본적으로 선택됩니다.

  • Finish를 클릭합니다.

기본적으로 두 개 이상의 열을 반환하는 가져온 각 저장 프로시저 또는 함수의 결과 도형은 자동으로 새 복합 형식이 됩니다. 이 예제에서는 GetStudentGrades 함수의 결과를 StudentGrade 엔터티에 매핑하고 GetDepartmentName 결과를 none에 매핑하려고 합니다(기본값은 없음임 ).

엔터티 형식을 반환하는 함수 가져오기의 경우 해당 저장 프로시저에서 반환된 열이 반환된 엔터티 형식의 스칼라 속성과 정확히 일치해야 합니다. 함수 가져오기는 단순 형식, 복합 형식 또는 값이 없는 컬렉션을 반환할 수도 있습니다.

  • 디자인 화면을 마우스 오른쪽 단추로 클릭하고 모델 브라우저를 선택합니다.
  • 모델 브라우저에서 함수 가져오기를 선택한 다음 GetStudentGrades 함수를 두 번 클릭합니다.
  • 함수 가져오기 편집 대화 상자에서 엔터티를 선택하고 StudentGrade를 선택합니다.
    함수 가져오기 대화 상자의 맨 위에 있는 함수 가져오기 구성 가능 확인란을 사용하면 구성 가능한 함수에 매핑할 수 있습니다. 이 확인란을 선택하면 저장 프로시저/함수 이름 드롭다운 목록에 구성 가능한 함수(테이블 반환 함수)만 표시됩니다. 이 확인란을 선택하지 않으면 구성할 수 없는 함수만 목록에 표시됩니다.

모델 사용

Main 메서드가 정의된 Program.cs 파일을 엽니다. Main 함수에 다음 코드를 추가합니다.

이 코드는 GetStudentGrades(지정된 StudentId에 대한 StudentGrades반환) 및 getDepartmentName(출력 매개 변수의 부서 이름 반환)의 저장 프로시저를 호출합니다.  

    using (SchoolEntities context = new SchoolEntities())
    {
        // Specify the Student ID.
        int studentId = 2;

        // Call GetStudentGrades and iterate through the returned collection.
        foreach (StudentGrade grade in context.GetStudentGrades(studentId))
        {
            Console.WriteLine("StudentID: {0}\tSubject={1}", studentId, grade.Subject);
            Console.WriteLine("Student grade: " + grade.Grade);
        }

        // Call GetDepartmentName.
        // Declare the name variable that will contain the value returned by the output parameter.
        ObjectParameter name = new ObjectParameter("Name", typeof(String));
        context.GetDepartmentName(1, name);
        Console.WriteLine("The department name is {0}", name.Value);

    }

애플리케이션을 컴파일하고 실행합니다. 프로그램에서는 다음이 출력됩니다.

StudentID: 2
Student grade: 4.00
StudentID: 2
Student grade: 3.50
The department name is Engineering

출력 매개 변수

출력 매개 변수를 사용하는 경우 결과를 완전히 읽을 때까지 해당 값을 사용할 수 없습니다. 이는 DbDataReader의 기본 동작 때문입니다. 자세한 내용은 DataReader를 사용한 데이터 검색을 참조하세요.