Partager via


Démarrage rapide d'EntityDataSource, exemple

Mise à jour : novembre 2007

L'exemple dans cette rubrique illustre l'utilisation du contrôle ADO.NET EntityDataSource pour implémenter un scénario de liaison de données. L'application d'exemple affiche des éléments SalesOrderDetail associés à un SalesOrderHeader identifié par la clé d'identité du SalesOrderHeader. Le modèle de données utilisé dans l'application est basé sur l'exemple de base de données AdventureWorks fourni avec SQL Server 2005.

L'écran suivant affiche l'outil en cours d'utilisation. Une zone de liste sur le côté gauche de la page contient les clés d'identité des éléments SalesOrderHeader. Dans l'affichage, le nombre SalesOrderHeader 43 666 a reçu un clic. Les éléments SalesOrderDetail associés sont affichés à droite par le contrôle Gridview.

Comment implémenter l'exemple

L'exemple est implémenté via les étapes suivantes :

  • Créer une application Web ASP.NET.

  • Ajouter un ADO.NET Entity Data Model basé sur la base de données AdventureWorks.

  • Ajouter une zone de liste pour afficher des clés SalesOrderHeader.

  • Ajouter un contrôle GridView pour afficher les éléments SalesOrderDetail associés.

  • Ajouter et configurer deux contrôles EntityDataSource pour fournir des données à la zone de liste et aux contrôles GridView.

  • Ajouter un gestionnaire d'événements pour l'événement de modification d'index sélectionnée dans la zone de liste.

Créer une application Web ASP.NET

  1. À partir du menu Fichier dans Visual Studio, créez une application ASP.NET. Nommez le projet GetOrders EDSC. Le balisage de la page Default.aspx s'ouvre et affiche un form HTML et une syntaxe div vides.

  2. Donnez un titre à la page entre les balises de titre.

Ajouter un ADO.NET Entity Data Model

Les données qui seront utilisées par cette application sont une implémentation de l'Entity Data Model (EDM) basé sur les tables de l'exemple AdventureWorks fourni avec SQL Server 2005.

Cinq entités sont déclarées :

  • Address

  • Contact

  • Produit

  • SalesOrderDetail

  • SalesOrderHeader

Les instances de ces types sont contenues logiquement par les jeux d'entités du même nom dans le modèle objet créé à partir du schéma conceptuel.

Trois associations et ensembles d'associations sont déclarés. Les noms des associations suivantes commencent tous par FK_. Cela reflète les relations de clé étrangère dans les tables des données AdventureWorks.

  • FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID

  • FK_SalesOrderHeader_Address_ShipToAddressID

  • FK_SalesOrderHeader_Contact_ContactID

Pour créer le modèle de vente AdventureWorks Sales Model :

  1. 1.Cliquez avec le bouton droit sur le projet GetOrders EDSC dans l' Explorateur de solutions.

  2. Cliquez sur Ajouterun nouvel élément.

  3. Sélectionnez l'ADO.NET Entity Data Model et nommez le nouveau modèle de données AdvWksSales.edmx.

  4. Lorsque l'Assistant Entity Data Model apparaît, sélectionnez Générer à partir de la base de données et cliquez sur Suivant.

  5. Créez une connexion à la base de données AdventureWorks et cliquez sur Suivant.

  6. Lorsque la boîte de dialogue Choisir vos objets de base de données apparaît, sélectionnez Address, Contact, Product, SalesOrderDetail et SalesOrderHeading. Cliquez sur Terminer.

  7. Le concepteur AdvWksSales.edmx s'ouvre et affiche les entités et associations du modèle de données. Notez l'association un-à-plusieurs entre l'entité SalesOrderHeader et l'entité SalesOrderDetail. Ces deux types de données et l'association entre les deux seront utilisés dans l'exemple d'application. Générez le projet pour créer le modèle de données.

Ajouter des contrôles pour afficher des données

Deux contrôles de données sont exigés pour afficher les clés SalesOrderHeader et les éléments SalesOrderDetail associés.

Pour ajouter des contrôles d'affichage à la page :

  1. Ouvrez Default.aspx en mode Design dans Visual Studio et faites glisser la bordure div vers le bas afin qu'il y ait assez de lace pour ajouter des contrôles à la page.

  2. Ajoutez une étiquette avec le texte : Select SalesOrderHeaderID.

  3. Au-dessous de l'étiquette, ajoutez une zone de liste. L'ID par défaut, ListBox1, peut être utilisé. Définissez la taille et la position de la zone de liste en fonction du balisage en bas de la page.

  4. Ajoutez un contrôle GridView à la page et définissez la position en fonction du balisage de la page en bas de cette rubrique. L'ID par défaut, GridView1, peut être utilisé.

  5. Ajoutez une étiquette au-dessus du contrôle GridView avec le texte : SalesOrderHeader ID.

  6. Ajoutez une autre étiquette au-dessus du GridView. Cette étiquette sera utilisée dans un paramètre d'un CommandText. Donnez-lui un ID qui reflète son objectif, tel que : labelHeaderIDFromList. Affectez au texte de cette étiquette une chaîne vide.

Ajouter et configurer des contrôles EntityDataSource

Pour ajouter les contrôles EntityDataSource :

  1. Ajoutez un contrôle EntityDataSource à la page. Nommez ce contrôle EntityDataSourceEntDataSrc_OrderID. Ce contrôle sera lié à ListBox1 pour afficher des clés SalesOrderHeader.

  2. Ajoutez un autre contrôle EntityDataSource à la page. Nommez ce contrôle EntityDataSourceEntDataSrc_OrderDetails. Ce contrôle sera lié au Gridview1 pour afficher des entités SalesOrderDetail associées à la clé d'identité SalesOrderHeader sélectionnée par l'utilisateur dans ListBox1.

Remarque :

Si le projet n'a pas été généré depuis l'ajout de l'Entity Data Model (EDM) pour AdvWksSalesModel, générez maintenant le projet, ou les étapes suivantes ne donneront pas les résultats décrits. La génération du projet de l'EDM place les artefacts des métadonnées de l'EDM à l'endroit prévu par la chaîne de connexion dans le fichier WebConfig.

Pour configurer la liaison des données de ListBox1 à EntDataSrc_OrderID :

  1. Cliquez sur le symbole > sur le contrôle EntityDataSource.

  2. Cliquez sur Configurer la source de données.

  3. Lorsque la boîte de dialogue Configurer le contexte de l'objet apparaît, sélectionnez Connexion nomméeAdventureWorksEntities dans la liste déroulante. Cela identifie une chaîne de connexion à partir du fichier WebConfig.

  4. Dans la liste déroulante DefaultContainerName, sélectionnez AdventureWorksEntities. C'est le nom du EntityContainer utilisé par le modèle de données dans sa structure de schéma. Cliquez sur Suivant.

  5. Lorsque la boîte de dialogue Configurer la sélection de données apparaît, sélectionnez SalesOrderHeader dans la liste déroulante EntitySetName. Ce type ne fait pas partie d'une hiérarchie d'héritage, donc l'EntityTypeFilter peut être laissé vide.

  6. Parmi les cases à cocher Instruction Select, activez SalesOrderID. Cliquez sur Terminer.

  7. Cliquez sur le symbole > sur ListBox1 et sélectionnez Choisir la source de données.

  8. Lorsque la boîte de dialogue Choisir une source de données apparaît, choisissez EntDataSrc_OrderID dans la liste déroulante Sélectionner une source de données. Sélectionnez SalesOrderID dans les deux listes déroulantes suivantes.

  9. Cliquez sur OK.

À ce stade, il sera instructif d'exécuter l'application. La zone de liste affichera toutes les clés d'identité des entités SalesOrderHeader dans la source de données. Ces informations seront utiles lorsque le reste de l'application sera implémenté et l'utilisateur pourra sélectionner une clé et afficher toutes les entités SalesOrderDetail associées au SalesOrderHeader dans Gridview1 sur le côté droit de la page.

Configurer EntityDataSource avec un contrôle GridView

Pour lier les commandes associées à Gridview1 :

  1. Sélectionnez le contrôle EntityDataSource nommé EntDataSrc_OrderDetails sur l'aire de conception de la page Default.aspx.

  2. Cliquez sur le symbole > sur le contrôle EntityDataSource.

  3. Cliquez sur Configurer la source de données.

  4. Lorsque la boîte de dialogue Configurer le contexte de l'objet apparaît, sélectionnez Connexion nomméeAdventureWorksEntities dans la liste déroulante.

  5. Dans la liste déroulante DefaultContainerName, sélectionnez AdventureWorksEntities.

  6. Cliquez sur Suivant.

  7. Lorsque la boîte de dialogue Configurer la sélection de données apparaît, sélectionnez SalesOrderDetail dans la liste déroulante EntitySetName. Ce type ne fait pas partie d'une hiérarchie d'héritage, donc l'EntityTypeFilter peut être laissé vide.

  8. Parmi les cases à cocher Instruction Select, activez SalesOrderDetailID, OrderQty, ProductID, UnitPrice et ModifiedDate.

  9. Cliquez sur Terminer.

  10. Cliquez avec le bouton droit sur le contrôle EntityDataSource, puis sélectionnez Propriétés.

  11. Dans la liste Propriétés, sélectionnez , et cliquez sur les points de suspension à droite de la zone de texte.

  12. Lorsque la boîte de dialogue Éditeur d'expression apparaît, tapez le texte suivant dans la zone de texte Expression Where : it.[SalesOrderID] = @parSalesOrderID.

  13. Cliquez sur le bouton Ajouter un paramètre sous la zone de liste Paramètres. Nommez le nouveau paramètre parSalesOrderID. Ce paramètre sera obtenu à partir du texte d'une étiquette définie lorsque l'utilisateur sélectionne une clé d'identité dans la zone de liste SalesOrderHeader. Cela est spécifié dans la liste déroulante Source du paramètre.

  14. Sélectionnez Contrôle.

  15. Dans la liste déroulante ControlID, sélectionnez labelHeaderIDFromList.

  16. Cliquez sur OK.

Gestionnaire d'événements pour la modification d'index sélectionnée dans la zone de liste

La dernière étape de cette implémentation consiste à connecter la clé d'identité sélectionnée par l'utilisateur pour un SalesOrderHeader à une requête qui retourne les propriétés de toutes les entités SalesOrderDetail associées au SalesOrderHeader sélectionné.

Vous avez configuré la requête pour retourner les propriétés : SalesOrderDetailID, OrderQty, ProductID, UnitPrice et ModifiedDate. Le contrôle EntityDataSource est configuré pour obtenir un paramètre du contrôle labelHeaderIDFromList sur la page Web et le fournir à une clause Where de la requête qui identifie le SalesOrderHeader associé aux entités SalesOrderDetail dont les propriétés seront affichées. Vous devez maintenant ajouter du code qui affecte à la propriété de texte du contrôle labelHeaderIDFromList à la clé d'identité d'un SalesOrderHeader sélectionné par l'utilisateur.

Pour créer un gestionnaire d'événements pour l'événement SelectedIndexChanged de ListBox1 :

  1. Sélectionnez ListBox1 dans l'aire de conception de page Web.

  2. Cliquez avec le bouton droit sur ListBox1 et sélectionnez Propriétés.

  3. Dans la liste Propriétés, cliquez sur l'option des événements.

  4. Double-cliquez sur l'événement SelectedIndexChanged. Cela ouvre la page code-behind d'ASP.NET, Default.aspx.cs ou Default.aspx.vb, et affiche le bloc de code pour le gestionnaire d'événements.

  5. Créez le gestionnaire d'événements affiché dans le bloc de code qui suit l'étape 6. Le code dans le gestionnaire affecte à la valeur de labelHeaderIDFromList la valeur sélectionnée par l'utilisateur dans ListBox1. Il attribue à la propriété DataSource de GridView1 la valeur EntDataSrcOrder. Enfin, il appelle la méthode DataBind sur EntDataSrc_OrderDetails. Le contrôle a été configuré pour interroger les données en fonction d'une clé d'identité de labelHeaderIDFromList.

  6. Affectez à la propriété AutoPostBack de ListBox1 la valeur true, pour que le serveur puisse lire la sélection dès qu'elle est réalisée.

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

Lorsque l'événement SelectedIndexChanged se déclenche, la requête prédéfinie avec la clause Where paramétrable s'exécute. Les propriétés affichées dans GridView1 sont celles des entités SalesOrderDetail associées au SalesOrderHeader sélectionné dans ListBox1.

Balisage de page de tous les contrôles

Le balisage de page suivant contient tous les contrôles et propriétés initialisés dans l'application qui affiche des entités SalesOrderDetail associées à un SalesOrderHeader que vous avez généré. La clause Where inclut un paramètre qui contient la clé étrangère du SalesOrderHeader associé aux entités SalesOrderDetail.

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

Implémentation avec du texte de commande

Le balisage dans la section précédente illustre une implémentation qui utilise une clause Where pour afficher des entités SalesOrderDetail associées à un SalesOrderHeader. Les mêmes résultats peuvent être obtenus par un CommandText avec une requête Entity SQL. Le paramètre, dans ce cas, est utilisé avec une requête qui contient une corrélation gauche. La corrélation gauche recherche les propriétés des entités SalesOrderHeader et 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>

Voir aussi

Concepts

Concepteur EntityDataSource

Autres ressources

Sélection de données à l'aide du contrôle EntityDataSource