다음을 통해 공유


EntityDataSource 퀵 스타트 예제

업데이트: 2007년 11월

이 항목의 예제에서는 ADO.NET EntityDataSource 컨트롤을 사용하여 데이터 바인딩 시나리오를 구현하는 방법을 보여 줍니다. 이 예제 응용 프로그램에서는 SalesOrderHeader의 ID 키로 식별되는 SalesOrderHeader와 연결된 SalesOrderDetail 항목을 표시합니다. 응용 프로그램에 사용되는 데이터 모델은 SQL Server 2005와 함께 제공되는 AdventureWorks 샘플 데이터베이스를 기반으로 합니다.

다음 화면에서는 사용 중인 도구를 보여 줍니다. 페이지 왼쪽에 있는 목록 상자에는 SalesOrderHeader 항목의 ID 키가 들어 있습니다. 표시된 화면에서는 SalesOrderHeader 번호 43666을 클릭한 상태이고 연결된 SalesOrderDetail 항목이 오른쪽에 있는 Gridview 컨트롤에 표시되어 있습니다.

예제 구현 방법

이 예제는 다음과 같은 단계로 구현됩니다.

  • ASP.NET 웹 응용 프로그램을 만듭니다.

  • AdventureWorks 데이터베이스를 기반으로 하는 ADO.NET 엔터티 데이터 모델을 추가합니다.

  • SalesOrderHeader 키를 표시하는 목록 상자를 추가합니다.

  • 연결된 SalesOrderDetail 항목을 표시하는 GridView 컨트롤을 추가합니다.

  • 목록 상자와 GridView 컨트롤에 데이터를 제공하는 EntityDataSource 컨트롤 두 개를 추가하고 구성합니다.

  • 목록 상자의 선택된 인덱스 변경 이벤트에 대한 이벤트 처리기를 추가합니다.

ASP.NET 웹 응용 프로그램 만들기

  1. Visual Studio의 파일 메뉴에서 ASP.NET 응용 프로그램을 만듭니다. 프로젝트 이름을 GetOrders EDSC로 지정합니다. 빈 HTML form 및 div 구문이 표시된 Default.aspx 페이지 태그가 열립니다.

  2. title 태그 사이에 페이지 제목을 지정합니다.

ADO.NET 엔터티 데이터 모델 추가

이 응용 프로그램에 사용되는 데이터는 SQL Server 2005와 함께 제공되는 AdventureWorks 샘플의 테이블을 기반으로 하는 EDM(엔터티 데이터 모델) 구현입니다.

5개의 엔터티가 선언됩니다.

  • Address

  • Contact

  • Product

  • SalesOrderDetail

  • SalesOrderHeader

이 형식의 인스턴스는 개념 스키마를 기반으로 빌드된 개체 모델에서 이름이 동일한 엔터티 집합에 의해 논리적으로 포함되었습니다.

3개의 연결 및 연결 집합이 선언됩니다. 다음 연결의 이름은 모두 FK_로 시작됩니다. 이는 AdventureWorks 데이터의 테이블에 있는 외래 키 관계를 나타냅니다.

  • FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID

  • FK_SalesOrderHeader_Address_ShipToAddressID

  • FK_SalesOrderHeader_Contact_ContactID

AdventureWorks Sales 모델을 만들려면

  1. 솔루션 탐색기에서 GetOrders EDSC 프로젝트를 마우스 오른쪽 단추로 클릭합니다.

  2. 추가/새 항목을 클릭합니다.

  3. ADO.NET Entity Data Model을 선택하고 새 데이터 모델의 이름을 AdvWksSales.edmx로 지정합니다.

  4. 엔터티 데이터 모델 마법사가 나타나면 데이터베이스에서 생성을 선택한 후 다음을 클릭합니다.

  5. AdventureWorks 데이터베이스에 대한 연결을 만들고 다음을 클릭합니다.

  6. 데이터베이스 개체 선택 대화 상자가 나타나면 Address, Contact, Product, SalesOrderDetail 및 SalesOrderHeading을 선택합니다. 마침을 클릭합니다.

  7. AdvWksSales.edmx 디자이너가 열리고 데이터 모델의 엔터티와 연결이 표시됩니다. SalesOrderHeader 엔터티와 SalesOrderDetail 엔터티 사이에는 일대다 관계가 있습니다. 샘플 응용 프로그램에서는 이 두 데이터 형식과 그 사이의 연결을 사용합니다. 프로젝트를 빌드하여 데이터 모델을 만듭니다.

데이터를 표시하는 컨트롤 추가

SalesOrderHeader 키와 연결된 SalesOrderDetail 항목을 표시하려면 데이터 컨트롤 두 개가 필요합니다.

페이지에 표시 컨트롤을 추가하려면

  1. Visual Studio에서 Default.aspx를 디자인 뷰로 열고 div 테두리를 아래로 끌어내려 페이지에 컨트롤을 추가할 충분한 공간을 확보합니다.

  2. 레이블을 추가하고 해당 텍스트를 Select SalesOrderHeaderID로 지정합니다.

  3. 레이블 아래에 목록 상자를 추가합니다. 기본 ID인 ListBox1을 사용할 수 있습니다. 이 페이지의 아래쪽에 있는 페이지 태그에 따라 목록 상자 크기와 위치를 설정합니다.

  4. 페이지에 GridView 컨트롤을 추가하고 이 항목의 아래쪽에 있는 페이지 태그에 따라 위치를 설정합니다. 기본 ID인 GridView1을 사용할 수 있습니다.

  5. GridView 컨트롤 위에 레이블을 추가하고 해당 텍스트를 SalesOrderHeader ID로 지정합니다.

  6. GridView 위에 또 다른 레이블을 추가합니다. 이 레이블은 나중에 CommandText의 매개 변수에 사용됩니다. 레이블에 용도를 나타내는 ID를 지정합니다(예: labelHeaderIDFromList). 이 레이블의 텍스트를 빈 문자열로 설정합니다.

EntityDataSource 컨트롤 추가 및 구성

EntityDataSource 컨트롤을 추가하려면

  1. 페이지에 EntityDataSource 컨트롤을 추가합니다. 이 EntityDataSource 컨트롤의 이름을 EntDataSrc_OrderID로 지정합니다. 이 컨트롤은 뒤에서 SalesOrderHeader 키를 표시하는 ListBox1에 바인딩합니다.

  2. 페이지에 또 다른 EntityDataSource 컨트롤을 추가합니다. 이 EntityDataSource 컨트롤의 이름을 EntDataSrc_OrderDetails로 지정합니다. 이 컨트롤은 뒤에서 사용자가 ListBox1에서 선택하는 SalesOrderHeader ID 키와 연결된 SalesOrderDetail 엔터티를 표시하는 Gridview1에 바인딩합니다.

참고:

AdvWksSalesModel에 대한 EDM(데이터 엔터티 모델)을 추가한 후 프로젝트를 빌드하지 않았다면 지금 프로젝트를 빌드하십시오. 그렇지 않으면 이후의 단계가 설명대로 작동하지 않습니다. EDM 프로젝트를 빌드하면 WebConfig 파일의 연결 문자열에 지정된 위치에 EDM 메타데이터 아티팩트가 배치됩니다.

ListBox1의 데이터 바인딩을 EntDataSrc_OrderID로 구성하려면

  1. EntityDataSource 컨트롤에서 > 기호를 클릭합니다.

  2. 데이터 소스 구성을 클릭합니다.

  3. ObjectContext 구성 대화 상자가 나타나면 명명된 연결 드롭다운 목록에서 AdventureWorksEntities를 선택합니다. 이렇게 하면 WebConfig 파일의 연결 문자열이 식별됩니다.

  4. DefaultContainerName 드롭다운 목록에서 AdventureWorksEntities를 선택합니다. 이 이름이 디자인 스키마의 데이터 모델에 사용되는 EntityContainer의 이름입니다. 다음을 클릭합니다.

  5. 데이터 선택 구성 대화 상자가 나타나면 EntitySetName 드롭다운 목록에서 SalesOrderHeader를 선택합니다. 이 형식은 상속 계층 구조에 속하지 않으므로 EntityTypeFilter가 비어 있을 수 있습니다.

  6. Select 문 확인란에서 SalesOrderID를 선택합니다. 마침을 클릭합니다.

  7. ListBox1에서 > 기호를 클릭하고 데이터 소스 선택을 선택합니다.

  8. 데이터 소스 선택 대화 상자가 나타나면 데이터 소스 선택 드롭다운 목록에서 EntDataSrc_OrderID를 선택합니다. 옆에 있는 두 드롭다운 목록에서 SalesOrderID를 선택합니다.

  9. 확인을 클릭합니다.

이 단계에서 응용 프로그램을 실행할 수 있어야 합니다. 목록 상자에 데이터 소스에 있는 모든 SalesOrderHeader 엔터티의 ID 키가 표시됩니다. 이 정보는 응용 프로그램의 나머지 부분을 구현할 때 유용하게 사용할 수 있으며 사용자가 키 하나를 선택하면 SalesOrderHeader와 연결된 모든 SalesOrderDetail 엔터티가 페이지 오른쪽에 있는 Gridview1에 표시됩니다.

GridView 컨트롤로 EntityDataSource 구성

연결된 주문을 Gridview1에 바인딩하려면

  1. Default.aspx 페이지의 디자인 화면에서 이름이 EntDataSrc_OrderDetails인 EntityDataSource 컨트롤을 선택합니다.

  2. EntityDataSource 컨트롤에서 > 기호를 클릭합니다.

  3. 데이터 소스 구성을 클릭합니다.

  4. ObjectContext 구성 대화 상자가 나타나면 명명된 연결 드롭다운 목록에서 AdventureWorksEntities를 선택합니다.

  5. DefaultContainerName 드롭다운 목록에서 AdventureWorksEntities를 선택합니다.

  6. 다음을 클릭합니다.

  7. 데이터 선택 구성 대화 상자가 나타나면 EntitySetName 드롭다운 목록에서 SalesOrderDetail을 선택합니다. 이 형식은 상속 계층 구조에 속하지 않으므로 EntityTypeFilter가 비어 있을 수 있습니다.

  8. Select 문 확인란에서 SalesOrderDetailID, OrderQty, ProductID, UnitPrice 및 ModifiedDate를 선택합니다.

  9. 마침을 클릭합니다.

  10. EntityDataSource 컨트롤을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

  11. 속성 목록에서 Where를 선택하고 텍스트 상자 오른쪽에 있는 줄임표를 클릭합니다.

  12. 식 편집기 대화 상자가 나타나면 Where 식 텍스트 영역에 it.[SalesOrderID] = @parSalesOrderID를 입력합니다.

  13. 매개 변수 목록 상자 아래에서 매개 변수 추가 단추를 클릭합니다. 새 매개 변수 이름을 parSalesOrderID로 지정합니다. 사용자가 SalesOrderHeader 목록 상자에서 ID 키를 선택하면 설정되는 레이블의 텍스트에서 이 매개 변수를 가져옵니다. 이는 매개 변수 소스 드롭다운 목록에 지정됩니다.

  14. 컨트롤을 선택합니다.

  15. ControlID 드롭다운 목록에서 labelHeaderIDFromList를 선택합니다.

  16. 확인을 클릭합니다.

목록 상자의 선택된 인덱스 변경에 대한 이벤트 처리기

이 구현의 마지막 단계는 사용자가 SalesOrderHeader에 대해 선택한 ID 키를 선택한 SalesOrderHeader와 연결된 모든 SalesOrderDetail 엔터티의 속성을 반환하는 쿼리와 연결하는 것입니다

앞에서 SalesOrderDetailID, OrderQty, ProductID, UnitPrice 및 ModifiedDate 속성을 반환하는 쿼리를 구성했습니다. EntityDataSource 컨트롤은 웹 페이지의 labelHeaderIDFromList 컨트롤에서 매개 변수를 가져와 속성을 표시할 SalesOrderDetail 엔터티와 연결된 SalesOrderHeader를 식별하는 쿼리의 Where 절에 해당 매개 변수를 제공하도록 구성되었습니다. 이제 labelHeaderIDFromList 컨트롤의 텍스트 속성을 사용자가 선택한 SalesOrderHeader의 ID 키로 설정하는 코드를 추가해야 합니다.

ListBox1의 SelectedIndexChanged 이벤트에 대한 이벤트 처리기를 만들려면

  1. 웹 페이지 디자인 화면에서 ListBox1을 선택합니다.

  2. ListBox1을 마우스 오른쪽 단추를 클릭하고 속성을 선택합니다.

  3. 속성 목록에서 이벤트 옵션을 클릭합니다.

  4. SelectedIndexChanged 이벤트를 두 번 클릭합니다. 그러면 ASP.NET 코드 숨김 페이지인 Default.aspx.cs 또는 Default.aspx.vb가 열리고 이벤트 처리기의 코드 블록이 표시됩니다.

  5. 6단계 다음에 나오는 코드 블록에 표시된 이벤트 처리기를 만듭니다. 이 처리기의 코드에서는 labelHeaderIDFromList 값을 사용자가 ListBox1에서 선택한 값으로 설정합니다. 그런 다음 GridView1의 DataSource 속성을 EntDataSrcOrder로 지정합니다. 마지막으로 EntDataSrc_OrderDetails에서 DataBind 메서드를 호출합니다. 이제 컨트롤이 labelHeaderIDFromList에서 ID 키를 기준으로 데이터를 쿼리하도록 구성되었습니다.

  6. 선택하는 즉시 서버에서 선택 내용을 읽을 수 있도록 ListBox1의 AutoPostBack 속성을 true로 설정합니다.

protected void ListBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    labelHeaderIDFromList.Text = ListBox1.SelectedValue;
    GridView1.DataSource = EntDataSrc_OrderDetails;
    GridView1.DataBind();
}

SelectedIndexChanged 이벤트가 발생하면 매개 변수화된 Where 절이 있는 미리 정의된 쿼리가 실행됩니다. GridView1에 표시되는 속성은 ListBox1에서 선택한 SalesOrderHeader와 연결된 SalesOrderDetail 엔터티의 속성입니다.

모든 컨트롤의 페이지 태그

다음 페이지 태그에는 앞서 빌드한 SalesOrderHeader와 연결된 SalesOrderDetail 엔터티를 표시하는 응용 프로그램에서 초기화된 모든 컨트롤과 속성이 포함되어 있습니다. Where 절에는 SalesOrderDetail 엔터티와 연결된 SalesOrderHeader의 외래 키를 포함하는 매개 변수가 들어 있습니다.

<body>
    <form id="form1" >
    <div style="height: 450px">
    
        <br />
        <asp:ListBox ID="ListBox1"  
            Height="275px" 
            Width="100px" 
            style="position:absolute; left:50px; top:80px"
            DataSourceID="EntDataSrc_OrderID" DataTextField="SalesOrderID" 
            DataValueField="SalesOrderID" AutoPostBack="True" 
            onselectedindexchanged="ListBox1_SelectedIndexChanged" >
        </asp:ListBox>
    
        <asp:GridView ID="GridView1" 
        style="position:absolute; left:200px; top:75px">
        </asp:GridView>
    
        <asp:Label ID="Label1"  
               Text="Select SalesOrderHeaderID"></asp:Label>
&nbsp;&nbsp;&nbsp;&nbsp;
        <asp:Label ID="Label2"  Text="SalesOrderHeaderID:"></asp:Label>
&nbsp;<asp:Label ID="labelHeaderIDFromList" ></asp:Label>
    
    </div>
    <asp:EntityDataSource ID="EntDataSrc_OrderID"  
        ConnectionString="name=AdventureWorksEntities" 
        DefaultContainerName="AdventureWorksEntities"
               EntitySetName="SalesOrderHeader">
    </asp:EntityDataSource>
    <asp:EntityDataSource ID="EntDataSrc_OrderDetails"  
        ConnectionString="name=AdventureWorksEntities" 
        DefaultContainerName="AdventureWorksEntities" 
        EntitySetName="SalesOrderDetail" 
        Select="it.[SalesOrderDetailID], it.[OrderQty],
             it.[ProductID], it.[UnitPrice], it.[ModifiedDate]" 
        Where="it.[SalesOrderID] = @parSalesOrderID">
        <WhereParameters>
            <asp:ControlParameter Name="parSalesOrderID" ControlID="labelHeaderIDFromList" Type="Int32"/>
        </WhereParameters>
    </asp:EntityDataSource>
    </form>
</body>

명령 텍스트를 사용한 구현

이전 단원의 태그에서는 Where 절을 사용하여 SalesOrderHeader와 연결된 SalesOrderDetail 엔터티를 표시하는 구현 방법을 보여 줍니다. Entity SQL 쿼리에 CommandText를 사용하여 이와 동일한 결과를 얻을 수도 있습니다. 여기서 이 매개 변수는 왼쪽 상관 관계를 포함하는 쿼리에 사용됩니다. 왼쪽 상관 관계는 SalesOrderHeader와 SalesOrderDetail 엔터티 모두의 속성을 찾습니다.

<body>
    <form id="form1" >
    <div style="height: 430px; width: 805px">
    
        Search Sales Orders <br />
        Select Order ID:&nbsp;&nbsp;&nbsp;&nbsp;
        <br />
        
        <asp:Label ID="LabelHeaderID" 
         Text="SalesOrderHeaderID:"
        style="position:absolute; left:200px; top:40px"></asp:Label>
        
        <asp:Label ID="LabelHeaderIDFromList"  Text=""
        style="position:absolute; left:375px; top:40px"></asp:Label>
        <br />
        <asp:ListBox ID="ListBox1" 
            DataSourceID="EntDatSrc_OrderID"
            DataTextField="SalesOrderID" 
            DataValueField="SalesOrderID" Height="285px" 
            Width="100px" style="position:absolute;
            left:50px; top:80px" 
            AutoPostBack="True"
            onselectedindexchanged="ListBox1_SelectedIndexChanged">
        </asp:ListBox>
        <asp:GridView ID="GridView1"  
            style="position:absolute; left:200px; top:80px"
            AllowPaging="false">
        </asp:GridView>
        <br />
    
    </div>
    <asp:EntityDataSource ID="EntDatSrc_OrderID"  
        DefaultContainerName="AdventureWorksEntities"
        EntitySetName="SalesOrderHeader" 
        Select="it.[SalesOrderID]"
        ConnectionString="name=AdventureWorksEntities">
    </asp:EntityDataSource>
    
    <asp:EntityDataSource ID="EntDatSrcOrderDetails"  
        DefaultContainerName="AdventureWorksEntities"        
        CommandText="SELECT soh.SalesOrderID, sod.SalesOrderDetailID, 
        sod.OrderQty, sod.ProductID, sod.UnitPrice, sod.ModifiedDate 
        FROM AdventureWorksEntities.SalesOrderHeader 
        AS soh, soh.SalesOrderDetail AS sod 
        WHERE soh.SalesOrderID = @parSalesOrderID" 
        ConnectionString="name=AdventureWorksEntities" >
        <CommandParameters>
            <asp:ControlParameter Name="parSalesOrderID"
            ControlID="LabelHeaderIDFromList" Type="Int32"/>
        </CommandParameters>
    </asp:EntityDataSource>
    
    </form>
</body>

참고 항목

개념

EntityDataSource 디자이너

기타 리소스

EntityDataSource를 사용하여 데이터 선택