작성자: Tom Dykstra
Contoso University 샘플 웹 애플리케이션은 Entity Framework 4.0 및 Visual Studio 2010을 사용하여 ASP.NET Web Forms 애플리케이션을 만드는 방법을 보여 줍니다. 자습서 시리즈에 대한 자세한 내용은 시리즈의 첫 번째 자습서를 참조하세요.
저장 프로시저 사용
이전 자습서에서는 계층별 테이블 상속 패턴을 구현했습니다. 이 자습서에서는 저장 프로시저를 사용하여 데이터베이스 액세스를 보다 자세히 제어하는 방법을 보여 줍니다.
Entity Framework를 사용하면 데이터베이스 액세스에 저장 프로시저를 사용하도록 지정할 수 있습니다. 엔터티 형식의 경우 해당 형식의 엔터티를 만들거나 업데이트하거나 삭제하는 데 사용할 저장 프로시저를 지정할 수 있습니다. 그런 다음 데이터 모델에서 엔터티 집합 검색과 같은 작업을 수행하는 데 사용할 수 있는 저장 프로시저에 대한 참조를 추가할 수 있습니다.
저장 프로시저를 사용하는 것은 데이터베이스 액세스에 대한 일반적인 요구 사항입니다. 경우에 따라 데이터베이스 관리자는 보안상의 이유로 모든 데이터베이스 액세스가 저장 프로시저를 통과하도록 요구할 수 있습니다. 다른 경우에는 Entity Framework가 데이터베이스를 업데이트할 때 사용하는 프로세스 중 일부에 비즈니스 논리를 빌드할 수 있습니다. 예를 들어 엔터티가 삭제될 때마다 보관 데이터베이스에 복사할 수 있습니다. 또는 행이 업데이트될 때마다 변경한 사용자를 기록하는 로깅 테이블에 행을 작성할 수 있습니다. Entity Framework가 엔터티를 삭제하거나 엔터티를 업데이트할 때마다 호출되는 저장 프로시저에서 이러한 종류의 작업을 수행할 수 있습니다.
이전 자습서와 마찬가지로 새 페이지는 만들지 않습니다. 대신 Entity Framework가 이미 만든 일부 페이지의 데이터베이스에 액세스하는 방식을 변경합니다.
이 자습서에서는 및 엔터티를 삽입하기 위한 저장 프로시저를 Student
Instructor
데이터베이스에 만듭니다. 데이터 모델에 추가하고 Entity Framework에서 데이터베이스에 및 Instructor
엔터티를 추가하는 Student
데 사용하도록 지정합니다. 엔터티를 검색 Course
하는 데 사용할 수 있는 저장 프로시저도 만듭니다.
데이터베이스에서 저장 프로시저 만들기
(이 자습서에서 다운로드할 수 있는 프로젝트에서 School.mdf 파일을 사용하는 경우 저장 프로시저가 이미 있으므로 이 섹션을 건너뛸 수 있습니다.)
서버 ExplorerSchool.mdf를 확장하고 저장 프로시저를 마우스 오른쪽 단추로 클릭한 다음 새 저장 프로시저 추가를 선택합니다.
다음 SQL 문을 복사하여 저장 프로시저 창에 붙여넣고 기본 저장 프로시저를 바꿉니다.
CREATE PROCEDURE [dbo].[InsertStudent]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
EnrollmentDate)
VALUES (@LastName,
@FirstName,
@EnrollmentDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
Student
엔터티에는 , , FirstName
LastName
및 의 네 가지 PersonID
속성이 있습니다EnrollmentDate
. 데이터베이스는 ID 값을 자동으로 생성하고 저장 프로시저는 다른 세 가지에 대한 매개 변수를 허용합니다. 저장 프로시저는 Entity Framework가 메모리에 유지되는 엔터티 버전에서 이를 추적할 수 있도록 새 행의 레코드 키 값을 반환합니다.
저장 프로시저 창을 저장하고 닫습니다.
InsertInstructor
다음 SQL 문을 사용하여 동일한 방식으로 저장 프로시저를 만듭니다.
CREATE PROCEDURE [dbo].[InsertInstructor]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
HireDate)
VALUES (@LastName,
@FirstName,
@HireDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
및 Instructor
엔터티에 대한 Student
저장 프로시저도 만듭니 Update
다. (데이터베이스에는 DeletePerson
및 Student
엔터티 모두 Instructor
에 대해 작동하는 저장 프로시저가 이미 있습니다.)
CREATE PROCEDURE [dbo].[UpdateStudent]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@EnrollmentDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
EnrollmentDate=@EnrollmentDate
WHERE PersonID=@PersonID;
CREATE PROCEDURE [dbo].[UpdateInstructor]
@PersonID int,
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime
AS
UPDATE Person SET LastName=@LastName,
FirstName=@FirstName,
HireDate=@HireDate
WHERE PersonID=@PersonID;
이 자습서에서는 각 엔터티 형식에 대해 삽입, 업데이트 및 삭제라는 세 가지 함수를 모두 매핑합니다. Entity Framework 버전 4를 사용하면 이러한 함수 중 하나 또는 두 개만 다른 함수를 매핑하지 않고 저장 프로시저에 매핑할 수 있습니다. 한 가지 예외는 예외입니다. 업데이트 함수를 매핑하지만 삭제 함수를 매핑하지 않으면 엔터티를 삭제하려고 할 때 Entity Framework가 예외를 throw합니다. Entity Framework 버전 3.5에서는 저장 프로시저를 매핑할 때 유연성이 별로 없었습니다. 하나의 함수를 매핑한 경우 세 함수를 모두 매핑해야 했습니다.
데이터를 업데이트하는 대신 읽는 저장 프로시저를 만들려면 다음 SQL 문을 사용하여 모든 Course
엔터티를 선택하는 프로시저를 만듭니다.
CREATE PROCEDURE [dbo].[GetCourses]
AS
SELECT CourseID, Title, Credits, DepartmentID FROM dbo.Course
데이터 모델에 저장 프로시저 추가
이제 저장 프로시저가 데이터베이스에 정의되어 있지만 Entity Framework에서 사용할 수 있도록 데이터 모델에 추가해야 합니다.
SchoolModel.edmx를 열고 디자인 화면을 마우스 오른쪽 단추로 클릭하고 데이터베이스에서 모델 업데이트를 선택합니다.
데이터베이스 개체 선택 대화 상자의 추가 탭에서 저장 프로시저를 확장하고 새로 만든 저장 프로시저 및 DeletePerson
저장 프로시저를 선택한 다음 마침을 클릭합니다.
저장 프로시저 매핑
데이터 모델 디자이너에서 엔터티를 마우스 오른쪽 단추로 Student
클릭하고 저장 프로시저 매핑을 선택합니다.
이 형식의 엔터티를 삽입, 업데이트 및 삭제하는 데 Entity Framework에서 사용해야 하는 저장 프로시저를 지정할 수 있는 매핑 세부 정보 창이 나타납니다.
Insert 함수를 InsertStudent로 설정합니다. 창에는 저장 프로시저 매개 변수 목록이 표시되며 각 매개 변수는 엔터티 속성에 매핑되어야 합니다. 이 중 두 가지는 이름이 동일하기 때문에 자동으로 매핑됩니다. 라는 FirstName
엔터티 속성이 없으므로 사용 가능한 엔터티 속성을 표시하는 드롭다운 목록에서 수동으로 선택 FirstMidName
해야 합니다. (첫 번째 자습서에서 속성 FirstMidName
의 FirstName
이름을 로 변경했기 때문입니다.)
동일한 매핑 세부 정보 창에서 함수를 Update
UpdateStudent
저장 프로시저에 매핑하고(저장 프로시저에 대해 했던 것처럼 에 대한 FirstName
Insert
매개 변수 값으로 지정 FirstMidName
했는지 확인) Delete
함수를 저장 프로시저에 DeletePerson
매핑합니다.
동일한 절차에 따라 강사의 저장 프로시저 삽입, 업데이트 및 삭제를 엔터티에 Instructor
매핑합니다.
데이터를 업데이트하는 대신 읽은 저장 프로시저의 경우 모델 브라우저 창을 사용하여 저장 프로시저를 반환하는 엔터티 형식에 매핑합니다. 데이터 모델 디자이너에서 디자인 화면을 마우스 오른쪽 단추로 클릭하고 모델 브라우저를 선택합니다.
SchoolModel.Store 노드를 연 다음 저장 프로시저 노드를 엽니다. 그런 다음 저장 프로시저를 GetCourses
마우스 오른쪽 단추로 클릭하고 함수 가져오기 추가를 선택합니다.
함수 가져오기 추가 대화 상자의 컬렉션 반환에서 선택한 엔터티를 반환한 다음 반환된 엔터티 형식으로 선택합니다Course
. 완료되면 확인을 클릭합니다.
.edmx 파일을 저장하고 닫습니다.
저장 프로시저 삽입, 업데이트 및 삭제 사용
데이터를 삽입, 업데이트 및 삭제하는 저장 프로시저는 데이터 모델에 데이터를 추가하고 적절한 엔터티에 매핑한 후 Entity Framework에서 자동으로 사용됩니다. 이제 StudentsAdd.aspx 페이지를 실행할 수 있으며, 새 학생을 만들 때마다 Entity Framework는 저장 프로시저를 사용하여 InsertStudent
테이블에 새 행을 Student
추가합니다.
Students.aspx 페이지를 실행하면 새 학생이 목록에 표시됩니다.
이름을 변경하여 업데이트 함수가 작동하는지 확인한 다음 학생을 삭제하여 delete 함수가 작동하는지 확인합니다.
저장 프로시저 선택 사용
Entity Framework는 와 같은 GetCourses
저장 프로시저를 자동으로 실행하지 않으며 컨트롤과 함께 EntityDataSource
사용할 수 없습니다. 이를 사용하려면 코드에서 호출합니다.
InstructorsCourses.aspx.cs 파일을 엽니다. 메서드는 PopulateDropDownLists
LINQ-to-Entities 쿼리를 사용하여 모든 과정 엔터티를 검색하여 목록을 반복하고 강사가 할당된 엔터티와 할당되지 않은 엔터티를 결정할 수 있도록 합니다.
var allCourses = (from c in context.Courses
select c).ToList();
이 코드를 다음 코드로 바꿉다.
var allCourses = context.GetCourses();
이제 페이지는 저장 프로시저를 GetCourses
사용하여 모든 과정의 목록을 검색합니다. 페이지를 실행하여 이전과 같이 작동하는지 확인합니다.
(저장 프로시저에서 검색된 엔터티의 탐색 속성은 기본 설정에 ObjectContext
따라 해당 엔터티와 관련된 데이터로 자동으로 채워지지 않을 수 있습니다. 자세한 내용은 MSDN 라이브러리에서 관련 개체 로드 를 참조하세요.)
다음 자습서에서는 동적 데이터 기능을 사용하여 데이터 서식 및 유효성 검사 규칙을 보다 쉽게 프로그래밍하고 테스트하는 방법을 알아봅니다. 데이터 형식 문자열과 같은 각 웹 페이지 규칙 및 필드가 필요한지 여부를 지정하는 대신 데이터 모델 메타데이터에서 이러한 규칙을 지정할 수 있으며 모든 페이지에 자동으로 적용됩니다.