Designer CUD 저장 프로시저Designer CUD Stored Procedures

이 단계별 연습에서는 \ Entity Framework Designer (EF Designer)를 사용 하 여 엔터티 형식의 create insert, update 및 delete (CUD) 작업을 저장 프로시저에 매핑하는 방법을 보여 줍니다.This step-by-step walkthrough show how to map the create\insert, update, and delete (CUD) operations of an entity type to stored procedures using the Entity Framework Designer (EF Designer). 기본적으로 Entity Framework는 CUD 작업에 대 한 SQL 문을 자동으로 생성 하지만 저장 프로시저를 이러한 작업에 매핑할 수도 있습니다. By default, the Entity Framework automatically generates the SQL statements for the CUD operations, but you can also map stored procedures to these operations.  

Code First은 저장 프로시저나 함수에 대 한 매핑을 지원 하지 않습니다.Note, that Code First does not support mapping to stored procedures or functions. 그러나 SqlQuery 메서드를 사용 하 여 저장 프로시저 또는 함수를 호출할 수 있습니다.However, you can call stored procedures or functions by using the System.Data.Entity.DbSet.SqlQuery method. 예를 들면 다음과 같습니다.For example:

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

CUD 작업을 저장 프로시저에 매핑할 때의 고려 사항Considerations when Mapping the CUD Operations to Stored Procedures

CUD 작업을 저장 프로시저에 매핑할 때는 다음과 같은 사항을 고려해 야 합니다.When mapping the CUD operations to stored procedures, the following considerations apply:

  • CUD 작업 중 하나를 저장 프로시저에 매핑하는 경우 모든 작업을 매핑합니다.If you are mapping one of the CUD operations to a stored procedure, map all of them. 세 가지를 모두 매핑하지 않으면 매핑되지 않은 작업이 실행 될 경우 실패 하 고 Updateexception   이 throw 됩니다.If you do not map all three, the unmapped operations will fail if executed and an UpdateException will be thrown.
  • 저장 프로시저의 모든 매개 변수를 엔터티 속성에 매핑해야 합니다.You must map every parameter of the stored procedure to entity properties.
  • 서버에서 삽입 된 행에 대 한 기본 키 값을 생성 하는 경우이 값을 다시 엔터티의 키 속성에 매핑해야 합니다.If the server generates the primary key value for the inserted row, you must map this value back to the entity's key property. 다음 예제에서 Insertperson   저장 프로시저는 새로 만든 기본 키를 저장 프로시저의 결과 집합의 일부로 반환 합니다.In the example that follows, the InsertPerson stored procedure returns the newly created primary key as part of the stored procedure's result set. 기본 키는 EF 디자이너의 ** < 결과 바인딩 > 추가**기능을 사용 하 여 엔터티 키 (**PersonID**)에 매핑됩니다   .The primary key is mapped to the entity key (PersonID) using the <Add Result Bindings> feature of the EF Designer.
  • 저장 프로시저 호출은 개념적 모델의 엔터티와 함께 1:1에 매핑됩니다.The stored procedure calls are mapped 1:1 with the entities in the conceptual model. 예를 들어 개념적 모델에서 상속 계층 구조를 구현 하 고 부모 (기본) 및 자식 (파생 된) 엔터티에 대 한 CUD 저장 프로시저를 매핑하는 경우 자식 변경 내용 저장은 자식의저장 프로시저만 호출 하 고 부모의저장 프로시저 호출을 트리거하지는 않습니다.For example, if you implement an inheritance hierarchy in your conceptual model and then map the CUD stored procedures for the Parent (base) and the Child (derived) entities, saving the Child changes will only call the Child’s stored procedures, it will not trigger the Parent’s stored procedures calls.

사전 요구 사항Prerequisites

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

프로젝트 설정Set up the Project

  • Visual Studio 2012을 엽니다.Open Visual Studio 2012.
  • 파일- > 새로 만들기- > 프로젝트를 선택 합니다.Select File-> New -> Project
  • 왼쪽 창에서 **Visual C # **를 클릭 한 다음 콘솔 템플릿을 선택 합니다.In the left pane, click Visual C#, and then select the Console template.
  • 이름으로 Cudsprocssample   을 입력 합니다.Enter CUDSProcsSample as the name.
  •  확인을 선택합니다.Select OK.

모델 만들기Create a Model

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

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

  • 파일 이름 에 대해 다음 을 입력 하 고 추가를 클릭 합니다.Enter CUDSProcs.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.

  • 데이터베이스 개체 선택 대화 상자의 테이블   노드에서 Person 테이블을 선택 합니다.In the Choose Your Database Objects dialog box, under the Tables node, select the Person table.

  • 또한 저장 프로시저 및 함수 노드에서 deleteperson, insertpersonupdateperson의 저장 프로시저를 선택 합니다.Also, select the following stored procedures under the Stored Procedures and Functions node: DeletePerson, InsertPerson, and UpdatePerson.

  • Visual Studio 2012부터 EF Designer는 저장 프로시저의 대량 가져오기를 지원 합니다.Starting with Visual Studio 2012 the EF Designer supports bulk import of stored procedures. 선택한 저장 프로시저 및 함수를 엔터티 모델로 가져오기 는 기본적으로 선택 되어 있습니다.The Import selected stored procedures and functions into the entity model is checked by default. 이 예제에서는 엔터티 형식을 삽입, 업데이트 및 삭제 하는 저장 프로시저를 포함 하 고 있으므로이를 가져오지 않고이 확인란의 선택을 취소 합니다.Since in this example we have stored procedures that insert, update, and delete entity types, we do not want to import them and will uncheck this checkbox.

    가져오기 S 프로시저

  •  마침을 클릭 합니다.Click Finish. 모델 편집을 위한 디자인 화면을 제공 하는 EF 디자이너가 표시 됩니다.The EF Designer, which provides a design surface for editing your model, is displayed.

Person 엔터티를 저장 프로시저에 매핑Map the Person Entity to Stored Procedures

  •  Person엔터티 형식을 마우스 오른쪽 단추로 클릭   하 고 저장 프로시저 매핑을 선택 합니다.Right-click the Person entity type and select Stored Procedure Mapping.

  • 저장 프로시저 매핑이 매핑 정보   창에 표시 됩니다.The stored procedure mappings appear in the Mapping Details window.

  • \ ** < 삽입 함수 > 선\택**을 클릭 합니다.Click <Select Insert Function>. 필드가 스토리지 모델의 저장 프로시저를 포함하는 드롭다운 목록이 됩니다. 이 목록의 저장 프로시저를 개념적 모델의 엔터티 형식에 매핑할 수 있습니다.The field becomes a drop-down list of the stored procedures in the storage model that can be mapped to entity types in the conceptual model. 드롭다운 목록에서 Insertperson   을 선택 합니다.Select InsertPerson from the drop-down list.

  • 저장 프로시저 매개 변수와 엔터티 속성 간의 기본 매핑이 나타납니다.Default mappings between stored procedure parameters and entity properties appear. 화살표는 매핑 방향을 나타냅니다. 즉, 속성 값이 저장 프로시저 매개 변수에 제공됩니다.Note that arrows indicate the mapping direction: Property values are supplied to stored procedure parameters.

  • \ ** < 결과 바인딩 > 추\가**를 클릭 합니다.Click <Add Result Binding>.

  •  NewPersonID를 입력 하 고 insertperson저장 프로시저에서 반환 된 매개 변수의 이름을 입력 합니다   .Type NewPersonID, the name of the parameter returned by the InsertPerson stored procedure. 선행 또는 후행 공백을 입력 하지 않아야 합니다.Make sure not to type leading or trailing spaces.

  •  Enter키를 누릅니다.Press Enter.

  • 기본적으로 NewPersonID   는 엔터티 키 PersonID에 매핑됩니다.By default, NewPersonID is mapped to the entity key PersonID. 화살표는 매핑 방향을 나타냅니다. 즉, 결과 열의 값이 속성에 제공됩니다.Note that an arrow indicates the direction of the mapping: The value of the result column is supplied to the property.

    매핑 정보

  • \ ** < 업데이트 > 함수 선\택**   을 클릭 하 고 결과 드롭다운 목록에서 updateperson을 선택   합니다.Click <Select Update Function> and select UpdatePerson from the resulting drop-down list.

  • 저장 프로시저 매개 변수와 엔터티 속성 간의 기본 매핑이 나타납니다.Default mappings between stored procedure parameters and entity properties appear.

  • \ ** < 함수 > 삭\제**   를 클릭 하 고 DeletePerson   결과 드롭다운 목록에서 deleteperson을 선택 합니다.Click <Select Delete Function> and select DeletePerson from the resulting drop-down list.

  • 저장 프로시저 매개 변수와 엔터티 속성 간의 기본 매핑이 나타납니다.Default mappings between stored procedure parameters and entity properties appear.

 Person엔터티 형식의 삽입, 업데이트 및 삭제 작업이   이제 저장 프로시저에 매핑됩니다.The insert, update, and delete operations of the Person entity type are now mapped to stored procedures.

저장 프로시저를 사용 하 여 엔터티를 업데이트 하거나 삭제할 때 동시성 검사를 사용 하도록 설정 하려면 다음 옵션 중 하나를 사용 합니다.If you want to enable concurrency checking when updating or deleting an entity with stored procedures, use one of the following options:

  • OUTPUT 매개 변수를 사용 하 여 저장 프로시저에서 영향을 받는 행 수를 반환 하 고 매개 변수 이름 옆의 영향을 받은 행 매개 변수확인란을 선택 합니다   .Use an OUTPUT parameter to return the number of affected rows from the stored procedure and check the Rows Affected Parameter checkbox next to the parameter name. 작업이 호출 될 때 반환 되는 값이 0 이면 OptimisticConcurrencyException이  OptimisticConcurrencyException   throw 됩니다.If the value returned is zero when the operation is called, an  OptimisticConcurrencyException will be thrown.
  • 동시성 검사에 사용 하려는 속성 옆의 원래 값 사용 확인란을 선택 합니다.Check the Use Original Value checkbox next to a property that you want to use for concurrency checking. 업데이트를 시도 하면 데이터를 데이터베이스에 다시 쓸 때 원래 데이터베이스에서 읽은 속성의 값이 사용 됩니다.When an update is attempted, the value of the property that was originally read from the database will be used when writing data back to the database. 값이 데이터베이스의 값과 일치 하지 않으면 OptimisticConcurrencyException   이 throw 됩니다.If the value does not match the value in the database, an OptimisticConcurrencyException will be thrown.

모델 사용Use the Model

Main 메서드가 정의 된 Program.cs 파일을 엽니다.Open the Program.cs file where the Main method is defined. Main 함수에 다음 코드를 추가 합니다.Add the following code into the Main function.

이 코드는 새 Person 개체를 만든 다음 개체를 업데이트 하 고 마지막으로 개체를 삭제 합니다.The code creates a new Person object, then updates the object, and finally deletes the object.

    using (var context = new SchoolEntities())
    {
        var newInstructor = new Person
        {
            FirstName = "Robyn",
            LastName = "Martin",
            HireDate = DateTime.Now,
            Discriminator = "Instructor"
        }

        // Add the new object to the context.
        context.People.Add(newInstructor);

        Console.WriteLine("Added {0} {1} to the context.",
            newInstructor.FirstName, newInstructor.LastName);

        Console.WriteLine("Before SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // SaveChanges will call the InsertPerson sproc.  
        // The PersonID property will be assigned the value
        // returned by the sproc.
        context.SaveChanges();

        Console.WriteLine("After SaveChanges, the PersonID is: {0}",
            newInstructor.PersonID);

        // Modify the object and call SaveChanges.
        // This time, the UpdatePerson will be called.
        newInstructor.FirstName = "Rachel";
        context.SaveChanges();

        // Remove the object from the context and call SaveChanges.
        // The DeletePerson sproc will be called.
        context.People.Remove(newInstructor);
        context.SaveChanges();

        Person deletedInstructor = context.People.
            Where(p => p.PersonID == newInstructor.PersonID).
            FirstOrDefault();

        if (deletedInstructor == null)
            Console.WriteLine("A person with PersonID {0} was deleted.",
                newInstructor.PersonID);
    }
  • 애플리케이션을 컴파일하고 실행합니다.Compile and run the application. 프로그램은 다음 출력을 생성 합니다. *The program produces the following output *

참고

PersonID는 서버에 의해 자동으로 생성 되므로 다른 숫자가 표시 될 가능성이 높습니다. *PersonID is auto-generated by the server, so you will most likely see a different number*

Added Robyn Martin to the context.
Before SaveChanges, the PersonID is: 0
After SaveChanges, the PersonID is: 51
A person with PersonID 51 was deleted.

최종 버전의 Visual Studio에서 작업 하는 경우 Intellitrace를 디버거와 함께 사용 하 여 실행 되는 SQL 문을 확인할 수 있습니다.If you are working with the Ultimate version of Visual Studio, you can use Intellitrace with the debugger to see the SQL statements that get executed.

Intellitrace를 사용 하 여 디버그