다음을 통해 공유


Entity Framework 4.0의 새로운 기능

작성자: Tom Dykstra

이 자습서 시리즈는 Entity Framework 자습서 시리즈를 사용하여 시작 만든 Contoso University 웹 애플리케이션을 기반으로 합니다. 이전 자습서를 완료하지 않은 경우 이 자습서의 시작점으로 만든 애플리케이션을 다운로드 할 수 있습니다. 전체 자습서 시리즈에서 만든 애플리케이션을 다운로드 할 수도 있습니다. 자습서에 대한 질문이 있는 경우 ASP.NET Entity Framework 포럼에 게시할 수 있습니다.

이전 자습서에서는 Entity Framework를 사용하는 웹 애플리케이션의 성능을 최대화하는 몇 가지 방법을 보았습니다. 이 자습서에서는 Entity Framework 버전 4에서 가장 중요한 새로운 기능 중 일부를 검토하고 모든 새 기능을 보다 완벽하게 소개하는 리소스에 연결합니다. 이 자습서에서 강조 표시된 기능에는 다음이 포함됩니다.

  • 외래 키 연결.
  • 사용자 정의 SQL 명령 실행
  • 모델 우선 개발.
  • POCO 지원.

또한 이 자습서에서는 Entity Framework의 다음 릴리스에서 제공되는 기능인 코드 우선 개발을 간략하게 소개합니다.

자습서를 시작하려면 Visual Studio를 시작하고 이전 자습서에서 작업하던 Contoso University 웹 애플리케이션을 엽니다.

Foreign-Key 연결

Entity Framework 버전 3.5에는 탐색 속성이 포함되어 있지만 데이터 모델에 외래 키 속성은 포함되지 않았습니다. 예를 들어 테이블의 CourseIDStudentGradeStudentID 열은 엔터티에서 StudentGrade 생략됩니다.

Image01

이 접근 방식의 이유는 엄밀히 말하면 외래 키는 물리적 구현 세부 정보이며 개념적 데이터 모델에 속하지 않기 때문입니다. 그러나 실제적인 문제로 외신 키에 직접 액세스할 수 있는 경우 코드에서 엔터티로 작업하는 것이 더 쉬운 경우가 많습니다.

데이터 모델의 외장 키가 코드를 단순화하는 방법의 예를 보려면 DepartmentsAdd.aspx 페이지를 코드하지 않고 코딩해야 하는 방법을 고려합니다. 엔터티 Administrator 에서 Department 속성은 엔터티에 Person 해당하는 PersonID 외래 키입니다. 새 부서와 관리자 간의 연결을 설정하기 위해 데이터 바운드 컨트롤의 이벤트 처리기에서 ItemInserting 속성 값을 Administrator 설정하기만 하면 됩니다.

protected void DepartmentsDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
    e.Values["Administrator"] = administratorsDropDownList.SelectedValue;
}

데이터 모델에 외향 키가 없으면 엔터티가 엔터티 집합에 추가되기 전에 엔터티 자체에 대한 참조를 가져오기 위해 데이터 바인딩 컨트롤의 이벤트 대신 ItemInserting 데이터 원본 제어의 이벤트를 처리 Inserting 합니다. 해당 참조가 있는 경우 다음 예제에서와 같은 코드를 사용하여 연결을 설정합니다.

departmentEntityToBeInserted.PersonReference.EntityKey = new System.Data.EntityKey("SchoolEntities.Departments", "PersonID", Convert.ToInt32(administratorsDropDownList.SelectedValue));
departmentEntityToBeInserted.Person = context.People.Single(p => p.PersonID == Convert.ToInt32(administratorsDropDownList.SelectedValue));

외래 키 연결에 대한 Entity Framework 팀의 블로그 게시물에서 볼 수 있듯이 코드 복잡성의 차이가 훨씬 더 큰 다른 경우가 있습니다. 더 간단한 코드를 위해 개념적 데이터 모델에서 구현 세부 정보를 사용하려는 사람들의 요구를 충족하기 위해 이제 Entity Framework는 데이터 모델에 외화 키를 포함하는 옵션을 제공합니다.

Entity Framework 용어에서 데이터 모델에 외래 키를 포함하는 경우 외래 키 연결을 사용하고 외래 키를 제외하는 경우 독립적인 연결을 사용합니다.

User-Defined SQL 명령 실행

이전 버전의 Entity Framework에서는 즉시 고유한 SQL 명령을 만들고 실행하는 쉬운 방법이 없었습니다. Entity Framework에서 동적으로 생성된 SQL 명령 또는 저장 프로시저를 만들고 함수로 가져와야 했습니다. 버전 4는 쿼리를 데이터베이스에 ObjectContext 직접 전달하기 쉽게 하는 클래스를 추가하고 메서드를 추가 ExecuteStoreQueryExecuteStoreCommand 합니다.

Contoso University 관리자가 저장 프로시저를 만들고 데이터 모델로 가져오는 프로세스를 거치지 않고도 데이터베이스에서 대량 변경을 수행할 수 있기를 원한다고 가정합니다. 첫 번째 요청은 데이터베이스의 모든 과정에 대한 크레딧 수를 변경할 수 있는 페이지에 대한 것입니다. 웹 페이지에서 모든 Course 행 열의 값을 곱하는 데 사용할 숫자를 입력하려고 합니다 Credits .

Site.Master master 페이지를 사용하는 새 페이지를 만들고 이름을 UpdateCredits.aspx로 지정합니다. 그런 다음, 라는 Content2컨트롤에 다음 태그를 Content 추가합니다.

<h2>Update Credits</h2>
    Enter the number to multiply the current number of credits by: 
    <asp:TextBox ID="CreditsMultiplierTextBox" runat="server"></asp:TextBox>
    <br /><br />
    <asp:Button ID="ExecuteButton" runat="server" Text="Execute" OnClick="ExecuteButton_Click" /><br /><br />
    Rows affected:
    <asp:Label ID="RowsAffectedLabel" runat="server" Text="0" ViewStateMode="Disabled"></asp:Label><br /><br />

이 태그는 TextBox 사용자가 승수 값을 입력할 수 있는 컨트롤, Button 명령을 실행하기 위해 클릭할 컨트롤 및 Label 영향을 받는 행 수를 나타내는 컨트롤을 만듭니다.

UpdateCredits.aspx.cs를 열고 단추 Click 이벤트에 대한 다음 using 문과 처리기를 추가합니다.

using ContosoUniversity.DAL;
protected void ExecuteButton_Click(object sender, EventArgs e)
{
    using (SchoolEntities context = new SchoolEntities())
    {
        RowsAffectedLabel.Text = context.ExecuteStoreCommand("UPDATE Course SET Credits = Credits * {0}", CreditsMultiplierTextBox.Text).ToString();
    }
}

이 코드는 텍스트 상자의 값을 사용하여 SQL Update 명령을 실행하고 레이블을 사용하여 영향을 받는 행 수를 표시합니다. 페이지를 실행하기 전에 Courses.aspx 페이지를 실행하여 일부 데이터의 "이전" 그림을 가져옵니다.

Image02

UpdateCredits.aspx를 실행하고 승수로 "10"을 입력한 다음 실행을 클릭합니다.

Image03

Courses.aspx 페이지를 다시 실행하여 변경된 데이터를 확인합니다.

Image04

(크레딧 수를 원래 값으로 다시 설정하려면 UpdateCredits.aspx.cs 에서 를 로 변경 Credits * {0}Credits / {0} 하고 페이지를 다시 실행하여 10을 수수로 입력합니다.)

코드에서 정의하는 쿼리를 실행하는 방법에 대한 자세한 내용은 방법: 데이터 원본에 대해 직접 명령 실행을 참조하세요.

Model-First 개발

이 연습에서는 먼저 데이터베이스를 만든 다음 데이터베이스 구조를 기반으로 데이터 모델을 생성했습니다. Entity Framework 4에서는 대신 데이터 모델로 시작하고 데이터 모델 구조를 기반으로 데이터베이스를 생성할 수 있습니다. 데이터베이스가 아직 없는 애플리케이션을 만드는 경우 모델 우선 접근 방식을 사용하면 물리적 구현 세부 정보에 대해 걱정하지 않고 애플리케이션에 개념적으로 적합한 엔터티 및 관계를 만들 수 있습니다. 그러나 이는 개발 초기 단계를 통해서만 그대로 유지됩니다. 결국 데이터베이스가 만들어지고 그 안에 프로덕션 데이터가 있으며 모델에서 다시 만드는 것은 더 이상 실용적이지 않습니다. 이 시점에서 데이터베이스 우선 접근 방법으로 돌아갑니다.)

자습서의 이 섹션에서는 간단한 데이터 모델을 만들고 해당 모델에서 데이터베이스를 생성합니다.

솔루션 탐색기DAL 폴더를 마우스 오른쪽 단추로 클릭하고 새 항목 추가를 선택합니다. 새 항목 추가 대화 상자의 설치된 템플릿에서 데이터를 선택한 다음, ADO.NET 엔터티 데이터 모델 템플릿을 선택합니다. 새 파일 이름을 AlumniAssociationModel.edmx 로 지정하고 추가를 클릭합니다.

Image06

그러면 엔터티 데이터 모델 마법사가 시작됩니다. 모델 콘텐츠 선택 단계에서 빈 모델을 선택한 다음 마침을 클릭합니다.

Image07

엔터티 데이터 모델 Designer 빈 디자인 화면으로 열립니다. 도구 상자에서 디자인 화면으로 엔터티 항목을 끌어옵니다.

Image08

엔터티 이름을 에서 Entity1Alumnus변경하고 속성 이름을 로 AlumnusId변경 Id 하고 라는 Name새 스칼라 속성을 추가합니다. 새 속성을 추가하려면 열 이름을 Id 변경한 후 Enter 키를 누르거나 엔터티를 마우스 오른쪽 단추로 클릭하고 스칼라 속성 추가를 선택할 수 있습니다. 새 속성의 기본 형식은 입니다 String. 이 간단한 데모에서는 괜찮지만 물론 속성 창에서 데이터 형식과 같은 항목을 변경할 수 있습니다.

동일한 방식으로 다른 엔터티를 만들고 이름을 로 지정합니다 Donation. 속성을 DonationIdId 변경하고 라는 DateAndAmount스칼라 속성을 추가합니다.

Image09

이러한 두 엔터티 간에 연결을 추가하려면 엔터티를 Alumnus 마우스 오른쪽 단추로 클릭하고 추가를 선택한 다음 연결을 선택합니다.

Image10

연결 추가 대화 상자의 기본값은 원하는 값(일대다, 탐색 속성 포함, 외세 키 포함)이므로 확인을 클릭합니다.

Image11

디자이너는 연결선과 외래 키 속성을 추가합니다.

Image12

이제 데이터베이스를 만들 준비가 되었습니다. 디자인 화면을 마우스 오른쪽 단추로 클릭하고 모델에서 데이터베이스 생성을 선택합니다.

Image13

그러면 데이터베이스 생성 마법사가 시작됩니다. 엔터티가 매핑되지 않았음을 나타내는 경고가 표시되면 당분간 무시할 수 있습니다.

데이터 연결 선택 단계에서 새 연결을 클릭합니다.

Image14

연결 속성 대화 상자에서 로컬 SQL Server Express instance 선택하고 데이터베이스 AlumniAssociation이름을 로 지정합니다.

Image15

데이터베이스를 만들 것인지 묻는 메시지가 표시되면 예를 클릭합니다. 데이터 연결 선택 단계가 다시 표시되면 다음을 클릭합니다.

요약 및 설정 단계에서 마침을 클릭합니다.

Image18

DDL(데이터 정의 언어) 명령이 포함된 .sql 파일이 만들어지지만 명령은 아직 실행되지 않았습니다.

Image20

시작 자습서 시리즈의 첫 번째 자습서에 대한 데이터베이스를 만들 School 때와 마찬가지로 SQL Server Management Studio 같은 도구를 사용하여 스크립트를 실행하고 테이블을 만듭니다. (데이터베이스를 다운로드하지 않는 한)

이제 모델을 사용한 것과 동일한 방식으로 웹 페이지에서 데이터 모델을 사용할 AlumniAssociationSchool 수 있습니다. 이를 시도하려면 테이블에 일부 데이터를 추가하고 데이터를 표시하는 웹 페이지를 만듭니다.

서버 Explorer 사용하여 및 Donation 테이블에 다음 행을 Alumnus 추가합니다.

Image21

Site.Master master 페이지를 사용하는 Alumni.aspx라는 새 웹 페이지를 만듭니다. 라는 Content2컨트롤에 다음 태그를 Content 추가합니다.

<h2>Alumni</h2>
    <asp:EntityDataSource ID="AlumniEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.AlumniAssociationModelContainer" EnableFlattening="False" 
        EntitySetName="Alumni">
    </asp:EntityDataSource>
    <asp:GridView ID="AlumniGridView" runat="server" 
        DataSourceID="AlumniEntityDataSource" AutoGenerateColumns="False"
        OnRowDataBound="AlumniGridView_RowDataBound"
        DataKeyNames="AlumnusId">
        <Columns>
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:TemplateField HeaderText="Donations">
                <ItemTemplate>
                    <asp:GridView ID="DonationsGridView" runat="server" AutoGenerateColumns="False">
                        <Columns>
                            <asp:BoundField DataField="DateAndAmount" HeaderText="Date and Amount" />
                        </Columns>
                    </asp:GridView>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

이 태그는 중첩된 GridView 컨트롤, 동문 이름을 표시하는 외부 컨트롤 및 기부 날짜 및 금액을 표시하는 내부 컨트롤을 만듭니다.

Alumni.aspx.cs를 엽니다. using 데이터 액세스 계층에 대한 문과 외부 컨트롤의 RowDataBound 이벤트에 대한 처리기를 GridView 추가합니다.

using ContosoUniversity.DAL; 

// ...

protected void AlumniGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var alumnus = e.Row.DataItem as Alumnus;
        var donationsGridView = (GridView)e.Row.FindControl("DonationsGridView");
        donationsGridView.DataSource = alumnus.Donations.ToList();
        donationsGridView.DataBind();
    }
}

이 코드는 현재 행 Alumnus 엔터티의 탐색 속성을 사용하여 Donations 내부 GridView 컨트롤을 데이터 바인딩합니다.

페이지를 실행합니다.

Image22

(참고: 이 페이지는 다운로드 가능한 프로젝트에 포함되어 있지만 작동하려면 로컬 SQL Server Express instance 데이터베이스를 만들어야 합니다. 데이터베이스는 App_Data 폴더에 .mdf 파일로 포함되지 않습니다.)

Entity Framework의 model-first 기능을 사용하는 방법에 대한 자세한 내용은 Entity Framework 4의 Model-First를 참조하세요.

POCO 지원

도메인 기반 디자인 방법론을 사용하는 경우 비즈니스 도메인과 관련된 데이터 및 동작을 나타내는 데이터 클래스를 디자인합니다. 이러한 클래스는 데이터를 저장(유지)하는 데 사용되는 특정 기술과 독립적이어야 합니다. 즉, 지속성 무지해야 합니다. 지속성 무시는 단위 테스트 프로젝트가 테스트에 가장 편리한 지속성 기술을 사용할 수 있기 때문에 클래스를 단위 테스트하기 쉽게 만들 수도 있습니다. 이전 버전의 Entity Framework는 엔터티 클래스가 클래스에서 EntityObject 상속되어야 하므로 많은 엔터티 프레임워크 관련 기능을 포함했기 때문에 지속성 무지에 대한 제한된 지원을 제공했습니다.

Entity Framework 4에서는 클래스에서 EntityObject 상속되지 않으므로 지속성이 무시되는 엔터티 클래스를 사용하는 기능이 도입되었습니다. Entity Framework의 컨텍스트에서 이와 같은 클래스를 일반적으로 일반 오래된 CLR 개체 (POCO 또는 POCO)라고 합니다. POCO 클래스를 수동으로 작성하거나 Entity Framework에서 제공하는 T4(텍스트 템플릿 변환 도구 키트) 템플릿을 사용하여 기존 데이터 모델을 기반으로 자동으로 생성할 수 있습니다.

Entity Framework에서 POTO를 사용하는 방법에 대한 자세한 내용은 다음 리소스를 참조하세요.

  • POCO 엔터티 작업. 자세한 정보가 있는 다른 문서에 대한 링크가 있는 POCO의 개요인 MSDN 문서입니다.
  • 연습: Entity Framework용 POCO 템플릿 이 게시물은 Entity Framework 개발 팀의 블로그 게시물이며 POKO에 대한 다른 블로그 게시물에 대한 링크가 있습니다.

Code-First 개발

Entity Framework 4에서 POCO를 지원하려면 여전히 데이터 모델을 만들고 엔터티 클래스를 데이터 모델에 연결해야 합니다. Entity Framework의 다음 릴리스에는 코드 우선 개발이라는 기능이 포함됩니다. 이 기능을 사용하면 데이터 모델 디자이너 또는 데이터 모델 XML 파일을 사용할 필요 없이 고유한 POCO 클래스와 함께 Entity Framework를 사용할 수 있습니다. 따라서 이 옵션을 코드 전용이라고도 합니다. 코드 우선코드 전용 모두 동일한 Entity Framework 기능을 참조합니다.)

코드 우선 개발 방법을 사용하는 방법에 대한 자세한 내용은 다음 리소스를 참조하세요.

또한 Contoso University 애플리케이션과 유사한 애플리케이션을 빌드하는 새로운 MVC Code-First 자습서는 2011년 봄에 게시될 예정입니다. https://asp.net/entity-framework/tutorials

추가 정보

이렇게 하면 Entity Framework의 새로운 기능과 Entity Framework 자습서 시리즈의 연속에 대한 개요가 완성됩니다. 여기에서 다루지 않는 Entity Framework 4의 새로운 기능에 대한 자세한 내용은 다음 리소스를 참조하세요.