Compartir a través de


Ejemplo de tutorial rápido de EntityDataSource

Actualización: noviembre 2007

El ejemplo de este tema muestra el uso del control EntityDataSource ADO.NET para implementar un escenario de enlace de datos. La aplicación de ejemplo muestra elementos SalesOrderDetail asociados a un elemento SalesOrderHeader identificada por la clave de identidad de SalesOrderHeader. El modelo de datos utilizado en la aplicación se basa en la base de datos de ejemplo de AdventureWorks que se distribuye con SQL Server 2005.

La siguiente presentación en pantalla muestra la herramienta en uso. Un cuadro de lista en el lado izquierdo de la página contiene claves de identidad de los elementos SalesOrderHeader. En la presentación, se ha hecho clic en el número 43666 de SalesOrderHeader. El control Gridview muestra los elementos SalesOrderDetail asociados a la derecha.

Cómo implementar el ejemplo

El ejemplo se implementa en las siguientes fases:

  • Cree una aplicación web ASP.NET.

  • Agregue un ADO.NET Entity Data Model basado en la base de datos AdventureWorks.

  • Agregue un cuadro de lista para mostrar las claves SalesOrderHeader.

  • Agregue un control GridView para mostrar los elementos SalesOrderDetail asociados.

  • Agregue y configure dos controles EntityDataSource para proporcionar datos al cuadro de lista y a los controles GridView.

  • Agregue un controlador de eventos para el evento de cambio del índice seleccionado del cuadro de lista.

Cree una aplicación web ASP.NET

  1. En el menú Archivo en Visual Studio, cree una aplicación ASP.NET. Denomine el proyecto GetOrders EDSC. El marcado de la página Default.aspx se abre mostrando sintaxis HTML form y div vacía.

  2. Dé un título a la página entre las etiquetas de marcado del título.

Agregue un ADO.NET Entity Data Model

Los datos que utilizará esta aplicación son una implementación de Entity Data Model (EDM) basada en las tablas de la base de datos de ejemplo AdventureWorks que se distribuye con SQL Server 2005.

Se declaran cinco entidades:

  • Address

  • Contact

  • Producto

  • SalesOrderDetail

  • SalesOrderHeader

Los conjuntos de entidades con el mismo nombre del modelo de objetos generado a partir del esquema conceptual contienen lógicamente instancias de estos tipos.

Se declaran tres asociaciones y conjuntos de asociaciones. Todos los nombres de las siguientes asociaciones comienzan con FK_. Esto refleja las relaciones de clave externa de las tablas de datos de AventureWorks.

  • FK_SalesOrderDetail_SalesOrderHeader_SalesOrderID

  • FK_SalesOrderHeader_Address_ShipToAddressID

  • FK_SalesOrderHeader_Contact_ContactID

Para crear el Modelo de ventas de AdventureWorks:

  1. 1.Haga clic con el botón secundario en el proyecto GetOrders EDSC en el Explorador de soluciones.

  2. Haga clic en Agregar/nuevo elemento.

  3. Seleccione ADO.NET Entity Data Model y asigne el nombre AdvWksSales.edmx al nuevo modelo de datos.

  4. Cuando aparezca el Asistente para Entity Data Model, seleccione Generar desde la base de datos y, a continuación, haga clic en Siguiente.

  5. Cree una conexión a la base de datos AdventureWorks y haga clic en Siguiente.

  6. Cuando aparezca el cuadro de diálogo Elija los objetos de base de datos, seleccione Address, Contact, Product, SalesOrderDetail y SalesOrderHeading. Haga clic en Finalizar.

  7. El diseñador AdvWksSales.edmx se abre y muestra las entidades y asociaciones del modelo de datos. Tenga en cuenta la asociación de uno a varios entre las entidades SalesOrderHeader y SalesOrderDetail. Estos dos tipos de datos y la asociación entre ellos se utilizarán en la aplicación de ejemplo. Genere el proyecto para crear el modelo de datos.

Agregar controles para mostrar datos

Se necesitan dos controles de datos para mostrar las claves SalesOrderHeader y los elementos SalesOrderDetail asociados.

Para agregar controles de presentación a la página:

  1. Abra la vista de diseño de Default.aspx en Visual Studio y arrastre el borde de div hacia abajo para que haya bastante espacio para agregar controles a la página.

  2. Agregue una etiqueta con texto: Select SalesOrderHeaderID.

  3. Debajo de la etiqueta agregue un cuadro de lista. Se puede utilizar el identificador predeterminado, ListBox1. Establezca el tamaño y posición del cuadro de lista según el marcado de página en la parte inferior de esta página.

  4. Agregue un control GridView a la página y establezca la posición según el marcado de página en la parte inferior de este tema. Se puede utilizar el identificador predeterminado GridView1.

  5. Agregue una etiqueta encima del control GridView con texto: SalesOrderHeader ID.

  6. Agregue otra etiqueta encima de GridView. Esta etiqueta se utilizará en un parámetro de CommandText. Asígnele un identificador que refleje su propósito, como: labelHeaderIDFromList. Establezca el texto de esta etiqueta en una cadena vacía.

Agregar y configurar controles EntityDataSource

Para agregar los controles EntityDataSource:

  1. Agregue un control EntityDataSource a la página. Denomine este control EntityDataSource como EntDataSrc_OrderID. Este control se enlazará a ListBox1 para mostrar las claves SalesOrderHeader.

  2. Agregue otro control EntityDataSource a la página. Denomine este control EntityDataSource como EntDataSrc_OrderDetails. Este control se enlazará a Gridview1 para mostrar las entidades SalesOrderDetail asociadas a la clave de identidad SalesOrderHeader seleccionada por el usuario en ListBox1.

Nota:

Si el proyecto no se ha generado desde que agregó el Entity Data Model (EDM) del AdvWksSalesModel, genere ahora el proyecto, o los pasos siguientes no funcionarán como se describe. Al generar el proyecto del EDM, se colocan los artefactos de metadatos del EDM en la ubicación designada por la cadena de conexión del archivo WebConfig.

Para configurar enlace de datos de ListBox1 en EntDataSrc_OrderID:

  1. Haga clic en el símbolo > en el control EntityDataSource.

  2. Haga clic en Configurar origen de datos.

  3. Cuando aparezca el cuadro de diálogo Configurar contexto del objeto, seleccione Conexión con nombreAdventureWorksEntities en la lista desplegable. Esto identifica una cadena de conexión del archivo WebConfig.

  4. En la lista desplegable DefaultContainerName, seleccione AdventureWorksEntities. Éste es el nombre de EntityContainer utilizado por el modelo de datos en su esquema de diseño. Haga clic en Siguiente.

  5. Cuando aparezca el cuadro de diálogo Configurar selección de datos, seleccione SalesOrderHeader en la lista desplegable EntitySetName. Este tipo no forma parte de una jerarquía de herencia, de modo que EntityTypeFilter se puede dejar vacío.

  6. En las casillas Instrucción SELECT, active SalesOrderID. Haga clic en Finalizar.

  7. Haga clic en el símbolo > en ListBox1 y seleccione Elegir origen de datos.

  8. Cuando aparezca el cuadro de diálogo Elegir un origen de datos, elija EntDataSrc_OrderID en la lista desplegable Seleccionar un origen de datos. Seleccione SalesOrderID en las dos listas desplegables siguientes.

  9. Haga clic en Aceptar.

En esta fase, será instructivo ejecutar la aplicación. El cuadro de lista mostrará todas las claves de identidad de las entidades SalesOrderHeader del origen de datos. Esta información será útil cuando se implemente el resto de la aplicación y el usuario pueda seleccionar una clave y mostrar todas las entidades SalesOrderDetail asociadas a la entidad SalesOrderHeader en Gridview1 en el lado derecho de la página.

Configurar EntityDataSource con el control GridView

Para enlazar los pedidos asociados a Gridview1:

  1. Seleccione el control EntityDataSource denominado EntDataSrc_OrderDetails en la superficie de diseño de la página Default.aspx.

  2. Haga clic en el símbolo > en el control EntityDataSource.

  3. Haga clic en Configurar origen de datos.

  4. Cuando aparezca el cuadro de diálogo Configurar contexto del objeto, seleccione Conexión con nombreAdventureWorksEntities en la lista desplegable.

  5. En la lista desplegable DefaultContainerName, seleccione AdventureWorksEntities.

  6. Haga clic en Siguiente.

  7. Cuando aparezca el cuadro de diálogo Configurar selección de datos, elija SalesOrderDetail en la lista desplegable EntitySetName. Este tipo no forma parte de una jerarquía de herencia, de modo que EntityTypeFilter se puede dejar vacío.

  8. En las casillas Instrucción SELECT, active SalesOrderDetailID, OrderQty, ProductID, UnitPrice y ModifiedDate.

  9. Haga clic en Finalizar.

  10. Haga clic con el botón secundario en el control EntityDataSource y seleccione Propiedades.

  11. En la lista Propiedades seleccione Where y haga clic en los puntos suspensivos situados en el lado derecho del cuadro de texto.

  12. Cuando aparezca el cuadro de diálogo Editor de expresiones, escriba el texto siguiente en el área de texto Expresión Where: it.[SalesOrderID] = @parSalesOrderID.

  13. Haga clic en el botón Agregar parámetro bajo el cuadro de lista Parámetros. Dé el nombre parSalesOrderID al nuevo parámetro. Este parámetro se obtendrá del texto de una etiqueta que se establece cuando el usuario selecciona una clave de identidad en el cuadro de lista SalesOrderHeader. Esto se especifica en la lista desplegable Origen de los parámetros.

  14. Seleccione Control.

  15. En la lista desplegable ControlID seleccione labelHeaderIDFromList.

  16. Haga clic en Aceptar.

Controlador de eventos del evento de cambio del índice seleccionado del cuadro de lista

La última fase de esta implementación consiste en conectar la selección del usuario de una clave de identidad para SalesOrderHeader a una consulta que devuelve las propiedades de todas las entidades SalesOrderDetail asociadas a la entidad SalesOrderHeader seleccionada.

Configuró la consulta para que devolviera las propiedades: SalesOrderDetailID, OrderQty, ProductID, UnitPrice y ModifiedDate. El control EntityDataSource está configurado para obtener un parámetro del control labelHeaderIDFromList en la página web y facilitarlo a una cláusula Where de la consulta que identifica el SalesOrderHeader asociado a las entidades SalesOrderDetail cuyas propiedades se mostrarán. Ahora tiene que agregar el código que establece la propiedad de texto del control labelHeaderIDFromList en la clave de identidad de una entidad SalesOrderHeader seleccionada por el usuario.

Para crear un controlador de eventos para el evento SelectedIndexChanged de ListBox1:

  1. Seleccione ListBox1 en la superficie de diseño de la página web.

  2. Haga clic con el botón secundario en ListBox1 y seleccione Propiedades.

  3. En la lista Propiedades, haga clic en la opción de eventos.

  4. Haga doble clic en el evento SelectedIndexChanged. Esto abre la página de código subyacente ASP.NET, Default.aspx.cs o Default.aspx.vb, y muestra el bloque de código del controlador de eventos.

  5. Cree el controlador de eventos mostrado en el bloque de código que sigue al paso 6. El código del controlador establece el valor de labelHeaderIDFromList en el valor seleccionado por el usuario en ListBox1. Asigna la propiedad DataSource de GridView1 a la clase EntDataSrcOrder. Finalmente, llama al método DataBind en EntDataSrc_OrderDetails. El control se ha configurado para consultar los datos basados en una clave de identidad de labelHeaderIDFromList.

  6. Establezca la propiedad AutoPostBack de ListBox1 en true, de modo que el servidor pueda leer la selección en cuanto se realice.

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

Cuando se activa el evento SelectedIndexChanged, se ejecuta la consulta predefinida con la cláusula Where parametrizada. Las propiedades mostradas en GridView1 son las de las entidades SalesOrderDetail asociadas a la entidad SalesOrderHeader seleccionada en ListBox1.

Marcado de página de todos los controles

El marcado de página siguiente contiene todos los controles y propiedades inicializadas en la aplicación que muestra las entidades SalesOrderDetail asociadas a una entidad SalesOrderHeader que ha estado generando. La cláusula Where incluye un parámetro que contiene la clave externa de la entidad SalesOrderHeader asociada a las entidades 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>

Implementación con texto de comando

El marcado de la sección anterior muestra una implementación que utiliza una cláusula Where para mostrar las entidades SalesOrderDetail asociadas a una entidad SalesOrderHeader. CommandText puede obtener los mismos resultados con una consulta de Entity SQL. El parámetro, en este caso, se utiliza con una consulta que contiene una correlación izquierda. La correlación izquierda busca propiedades de las entidades SalesOrderHeader y 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>

Vea también

Conceptos

Diseñador EntityDataSource

Otros recursos

Selección de datos mediante EntityDataSource