Freigeben über


EntityDataSource-Schnellstartbeispiel

Aktualisiert: November 2007

Das Beispiel in diesem Thema veranschaulicht, wie Sie mit dem EntityDataSource-Steuerelement von ASP.NET ein Datenbindungsszenario implementieren. In der Beispielanwendung werden SalesOrderDetail-Elemente angezeigt, die einem SalesOrderHeader zugewiesen sind und durch den Identitätsschlüssel von SalesOrderHeader angegeben werden. Das in der Anwendung verwendete Datenmodell basiert auf der AdventureWorks-Beispieldatenbank, die im Lieferumfang von SQL Server 2005 enthalten ist.

In der folgenden Bildschirmdarstellung ist die Verwendung des Tools zu sehen. Ein Listenfeld auf der linken Seite enthält die Identitätsschlüssel von SalesOrderHeader-Elementen. In der Anzeige wurde auf das SalesOrderHeader-Element mit der Nummer 43666 geklickt. Die verknüpften SalesOrderDetail-Elemente werden vom Gridview-Steuerelement auf der rechten Seite angezeigt.

So implementieren Sie das Beispiel

Das Beispiel wird in den folgenden Schritten implementiert:

  • Erstellen Sie eine ASP.NET-Webanwendung.

  • Fügen Sie ein ADO.NET Entity Data Model auf Grundlage der AdventureWorks-Datenbank hinzu.

  • Fügen Sie ein Listenfeld hinzu, um SalesOrderHeader-Schlüssel anzuzeigen.

  • Fügen Sie ein GridView-Steuerelement hinzu, um verknüpfte SalesOrderDetail-Elemente anzuzeigen.

  • Fügen Sie zwei EntityDataSource-Steuerelemente hinzu, und konfigurieren Sie diese, um Daten an das Listenfeld und die GridView-Steuerelemente zu übergeben.

  • Fügen Sie einen Ereignishandler für das SelectedIndexChanged-Ereignis des Listenfelds hinzu.

Erstellen einer ASP.NET-Webanwendung

  1. Erstellen Sie im Menü Datei in Visual Studio eine ASP.NET-Anwendung. Geben Sie als Namen für das Projekt GetOrders EDSC an. Das Markup der Seite Default.aspx wird geöffnet und zeigt ein leeres HTML-form und div-Syntax an.

  2. Geben Sie zwischen den Titelmarkuptags einen Titel für die Seite ein.

Hinzufügen eines ADO.NET Entity Data Model

Die in der Anwendung verwendeten Daten sind eine EDM-Implementierung (Entity Data Model), die auf den Tabellen in der mit SQL Server 2005 ausgelieferten AdventureWorks-Beispieldatenbank basiert.

Es werden fünf Entitäten deklariert:

  • Adresse

  • Contact

  • Produkt

  • SalesOrderDetail

  • SalesOrderHeader

Instanzen dieser Typen sind logisch in Entitätssätzen mit denselben Namen in dem aus dem konzeptionellen Schema erstellten Objektmodell enthalten.

Es werden drei Zuordnungen und Zuordnungssätze deklariert. Die Namen der folgenden Zuordnungen beginnen mit FK_. Dies kennzeichnet Fremdschlüsselbeziehungen in den Tabellen der AdventureWorks-Datenbank.

  • FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID

  • FK_SalesOrderHeader_Address_ShipToAddressID

  • FK_SalesOrderHeader_Contact_ContactID

So erstellen Sie das AdventureWorks Sales-Modell

  1. 1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt GetOrders EDSC.

  2. Klicken Sie auf Hinzufügen / Neues Element.

  3. Wählen Sie ADO.NET Entity Data Model aus, und geben Sie als Namen für das neue Datenmodell AdvWksSales.edmx ein.

  4. Wenn der Assistent für Entity Data Model angezeigt wird, wählen Sie Aus Datenbank generieren aus, und klicken Sie dann auf Weiter.

  5. Erstellen Sie eine Verbindung zur AdventureWorks-Datenbank, und klicken Sie auf Weiter.

  6. Wählen Sie im angezeigten Dialogfeld Wählen Sie Ihre Datenbankobjekte aus die Objekte Address, Contact, Product, SalesOrderDetail und SalesOrderHeading aus. Klicken Sie auf Fertig stellen.

  7. Der AdvWksSales.edmx-Designer wird geöffnet und zeigt die Entitäten und Zuordnungen des Datenmodells an. Beachten Sie die 1:n-Zuordnung zwischen der SalesOrderHeader-Entität und der SalesOrderDetail-Entität. Diese zwei Datentypen und die Zuordnung zwischen ihnen werden in der Beispielanwendung verwendet. Erstellen Sie das Projekt, um das Datenmodell zu erstellen.

Hinzufügen von Steuerelementen zum Anzeigen von Daten

Es werden zwei Datensteuerelemente benötigt, um SalesOrderHeader-Schlüssel und zugeordnete SalesOrderDetail-Elemente anzuzeigen.

So fügen Sie der Seite Anzeigesteuerelemente hinzu

  1. Öffnen Sie die Entwurfsansicht Default.aspx in Visual Studio, und ziehen Sie den div-Rand nach unten, sodass genügend Platz zum Hinzufügen von Steuerelementen zu der Seite verfügbar ist.

  2. Fügen Sie eine Bezeichnung mit dem folgendem Text hinzu: Select SalesOrderHeaderID.

  3. Fügen Sie unterhalb der Bezeichnung ein Listenfeld hinzu. Sie können die Standard-ID, ListBox1, verwenden. Legen Sie die Größe und Position des Listenfelds entsprechend dem Seitenmarkup unten auf dieser Seite fest.

  4. Fügen Sie ein GridView-Steuerelement zu der Seite hinzu, und legen Sie die Position entsprechend dem Seitenmarkup unten in diesem Thema fest. Sie können die Standard-ID, GridView1, verwenden.

  5. Fügen Sie über dem GridView-Steuerelement eine Bezeichnung mit dem folgenden Text hinzu: SalesOrderHeader ID.

  6. Fügen Sie über GridView eine weitere Bezeichnung hinzu. Diese Bezeichnung wird in einem Parameter von CommandText verwendet. Geben Sie eine ID an, die den Zweck widerspiegelt, z. B. labelHeaderIDFromList. Legen Sie als Text für diese Bezeichnung eine leere Zeichenfolge fest.

Hinzufügen und Konfigurieren von EntityDataSource-Steuerelementen

So fügen Sie EntityDataSource-Steuerelemente hinzu

  1. Fügen Sie der Seite ein EntityDataSource-Steuerelement hinzu. Geben Sie als Namen für dieses EntityDataSource-Steuerelement EntDataSrc_OrderID ein. Dieses Steuerelement wird an ListBox1 gebunden, um SalesOrderHeader-Schlüssel anzuzeigen.

  2. Fügen Sie der Seite ein weiteres EntityDataSource-Steuerelement hinzu. Geben Sie als Namen für dieses EntityDataSource-Steuerelement EntDataSrc_OrderDetails ein. Dieses Steuerelement wird an Gridview1 gebunden, um SalesOrderDetail-Entitäten anzuzeigen, die mit dem vom Benutzer in ListBox1 ausgewählten SalesOrderHeader-Identitätsschlüssel verknüpft sind.

Hinweis:

Wenn das Projekt seit dem Hinzufügen des Entity Data Model (EDM) für AdvWksSalesModel nicht erstellt wurde, müssen Sie es nun erstellen. Andernfalls werden die folgenden Schritte nicht wie beschrieben ausgeführt. Beim Erstellen des EDM-Projekts werden die EDM-Metadatenartefakte an der Position platziert, die durch die Verbindungszeichenfolge in der Datei WebConfig angegeben wird.

So konfigurieren Sie die Datenbindung von ListBox1 an EntDataSrc_OrderID:

  1. Klicken Sie im EntityDataSource-Steuerelement auf das Symbol >.

  2. Klicken Sie auf Datenquelle konfigurieren.

  3. Wählen Sie im eingeblendeten Dialogfeld ObjectContext konfigurieren aus der Dropdownliste Benannte VerbindungAdventureWorksEntities aus. Dies gibt eine Verbindungszeichenfolge aus der Datei WebConfig an.

  4. Wählen Sie aus der Dropdownliste DefaultContainerName den Eintrag AdventureWorksEntities aus. Dies ist der Name des EntityContainer, der vom Datenmodell im Entwurfsschema verwendet wird. Klicken Sie auf Next.

  5. Wenn das Dialogfeld Datenauswahl konfigurieren angezeigt wird, wählen Sie in der Dropdownliste EntitySetName den Eintrag SalesOrderHeader aus. Dieser Typ ist nicht in einer Vererbungshierarchie enthalten, sodass EntityTypeFilter leer gelassen werden kann.

  6. Aktivieren Sie unter SELECT-Anweisung das Kontrollkästchen SalesOrderID. Klicken Sie auf Fertig stellen.

  7. Klicken Sie am ListBox1-Steuerelement auf das Symbol >, und wählen Sie Datenquelle auswählen aus.

  8. Wählen Sie im eingeblendeten Dialogfeld Datenquelle auswählen aus der Dropdownliste Datenquelle auswählen den Eintrag EntDataSrc_OrderID aus. Wählen Sie in den beiden nachfolgenden Dropdownlisten SalesOrderID aus.

  9. Klicken Sie auf OK.

An diesem Punkt ist es hilfreich, die Anwendung auszuführen. Das Listenfeld zeigt alle Identitätsschlüssel der SalesOrderHeader-Entitäten in der Datenquelle an. Diese Informationen sind nützlich, wenn Sie den Rest der Anwendung implementieren. Der Benutzer kann einen Schlüssel auswählen und alle mit SalesOrderHeader verknüpften SalesOrderDetail-Entitäten in Gridview1 auf der rechten Seite anzeigen.

Konfigurieren von EntityDataSource mit dem GridView-Steuerelement

So binden Sie die verknüpften Bestellungen an Gridview1

  1. Wählen Sie in der Entwurfsoberfläche der Seite Default.aspx das EntityDataSource-Steuerelement mit dem Namen EntDataSrc_OrderDetails aus.

  2. Klicken Sie im EntityDataSource-Steuerelement auf das Symbol >.

  3. Klicken Sie auf Datenquelle konfigurieren.

  4. Wählen Sie im eingeblendeten Dialogfeld ObjectContext konfigurieren aus der Dropdownliste Benannte VerbindungAdventureWorksEntities aus.

  5. Wählen Sie aus der Dropdownliste DefaultContainerName den Eintrag AdventureWorksEntities aus.

  6. Klicken Sie auf Next.

  7. Wenn das Dialogfeld Datenauswahl konfigurieren angezeigt wird, wählen Sie aus der Dropdownliste EntitySetName den Eintrag SalesOrderDetail aus. Dieser Typ ist nicht in einer Vererbungshierarchie enthalten, sodass EntityTypeFilter leer gelassen werden kann.

  8. Aktivieren Sie unter SELECT-Anweisung die Kontrollkästchen SalesOrderDetailID, OrderQty, ProductID, UnitPrice und ModifiedDate.

  9. Klicken Sie auf Fertig stellen.

  10. Klicken Sie mit der rechten Maustaste auf das EntityDataSource-Steuerelement, und wählen Sie Eigenschaften aus.

  11. Wählen Sie aus der Liste Eigenschaften den Eintrag Where aus, und klicken Sie auf die Auslassungszeichen auf der rechten Seite des Textfelds.

  12. Geben Sie in das eingeblendete Dialogfeld Ausdrucks-Editor den folgenden Text in das Textfeld +++Where-Ausdruck ein: it.[SalesOrderID] = @parSalesOrderID.

  13. Klicken Sie unter dem Listenfeld Parameter auf die Schaltfläche Parameter hinzufügen. Geben Sie als Namen für den neuen Parameter parSalesOrderID ein. Dieser Parameter wird aus dem Text einer Bezeichnung ermittelt, die festgelegt wird, wenn ein Benutzer im Listenfeld SalesOrderHeader einen Identitätsschlüssel auswählt. Dies wird in der Dropdownliste Parameterquelle angegeben.

  14. Wählen Sie Steuerelement aus.

  15. Wählen Sie aus der Dropdownliste ControlID den Eintrag labelHeaderIDFromList aus.

  16. Klicken Sie auf OK.

Ereignishandler für das SelectedIndexChanged-Ereignis des Listenfelds

Der letzte Schritt bei dieser Implementierung besteht darin, die Benutzerauswahl eines Identitätsschlüssels für SalesOrderHeader mit einer Abfrage zu verbinden, die Eigenschaften für alle mit dem ausgewählten SalesOrderHeader verknüpften SalesOrderDetail-Entitäten zurückgibt.

Sie können die Abfrage so konfigurieren, dass die folgenden Eigenschaften zurückgegeben werden: SalesOrderDetailID, OrderQty, ProductID, UnitPrice und ModifiedDate. Das EntityDataSource-Steuerelement ist so konfiguriert, dass es einen Parameter aus dem Steuerelement labelHeaderIDFromList auf der Webseite abruft und an eine Where-Klausel der Abfrage übergibt. Diese Klausel identifiziert den SalesOrderHeader, der SalesOrderDetail-Entitäten zugeordnet ist, deren Eigenschaften angezeigt werden. Sie müssen nun Code hinzufügen, durch den die Texteigenschaft des Steuerelements labelHeaderIDFromList auf den Identitätsschlüssel eines vom Benutzer ausgewählten SalesOrderHeader festgelegt wird.

So erstellen Sie einen Ereignishandler für das SelectedIndexChanged-Ereignis von ListBox1

  1. Wählen Sie in der Entwurfsoberfläche der Webseite ListBox1 aus.

  2. Klicken Sie mit der rechten Maustaste auf ListBox1, und wählen Sie Eigenschaften aus.

  3. Klicken Sie in der Liste Eigenschaften auf die Ereignisoption.

  4. Doppelklicken Sie auf das Ereignis SelectedIndexChanged. Hierdurch wird die Code-Behind-Datei von ASP.NET, d. h. Default.aspx.cs oder Default.aspx.vb, geöffnet und der Codeblock für den Ereignishandler angezeigt.

  5. Erstellen Sie den Ereignishandler, der in dem Codeblock nach Schritt 6 angezeigt wird. Durch den Code in dem Handler wird der Wert von labelHeaderIDFromList auf den vom Benutzer ausgewählten Wert in ListBox1 festgelegt. Weiterhin wird die DataSource-Eigenschaft von GridView1 zu EntDataSrcOrder zugewiesen. Abschließend wird die DataBind-Methode für EntDataSrc_OrderDetails abgerufen. Das Steuerelement wurde so konfiguriert, dass es die Daten auf Grundlage eines Identitätsschlüssels aus labelHeaderIDFromList abfragt.

  6. Legen Sie die AutoPostBack-Eigenschaft von ListBox1 auf true fest, damit der Server die Auswahl direkt lesen kann.

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

Wenn das SelectedIndexChanged-Ereignis ausgelöst wird, wird die vordefinierte Abfrage mit der parametrisierten Where-Klausel ausgeführt. In GridView1 werden die Eigenschaften der SalesOrderDetail-Entitäten angezeigt, die mit dem in ListBox1 ausgewählten SalesOrderHeader verknüpft sind.

Seitenmarkup aller Steuerelemente

Das folgende Seitenmarkup enthält alle Steuerelemente und Eigenschaften, die in der Anwendung initialisiert wurden, die Sie erstellt haben und die mit einem SalesOrderHeader verknüpfte SalesOrderDetail-Entitäten anzeigt. Die Where-Klausel beinhaltet einen Parameter, der den Fremdschlüssel des mit den SalesOrderDetail-Entitäten verknüpften SalesOrderHeader enthält.

<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>

Implementierung mit Befehlstext

Das Markup im vorangehenden Abschnitt zeigt eine Implementierung, die eine Where-Klausel verwendet, um die mit einem SalesOrderHeader verknüpften SalesOrderDetail-Entitäten anzuzeigen. Die gleichen Ergebnisse können mit einem CommandText mit einer Entity SQL-Abfrage erzielt werden. Der Parameter wird in diesem Fall mit einer Abfrage verwendet, die eine Linkskorrelation enthält. Die Linkskorrelation sucht Eigenschaften beider Entitäten, SalesOrderHeader und 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>

Siehe auch

Konzepte

EntityDataSource-Designer

Weitere Ressourcen

Datenauswahl mit EntityDataSource