Enlazar objetos a controles (Entity Framework)

Entity Framework permite enlazar controles tales como ComboBox, ListView y DataGridView a un EntityCollection o a un ObjectResult que se devuelve al ejecutar un ObjectQuery. Ambas clases de Entity Framework implementan la interfaz IListSource para el enlace de datos. Los tipos de entidad que se generan mediante las herramientas de Entity Framework implementan INotifyPropertyChanged. De esta forma se habilita el enlace de datos bidireccional entre las propiedades y los controles de los objetos para que las actualizaciones de los controles se propaguen de nuevo a las propiedades del objeto enlazado.

Para enlazar los objetos a un control Windows Form, establezca la propiedad DataSource del control al elemento EntityCollection o ObjectResult que se devuelve cuando se llama al método Execute en un objeto ObjectQuery. En el siguiente ejemplo EntityCollection se enlaza a DataGridView:

// Bind the items for this order to the DataGridView.
lineItemsDataGrid.DataSource = order.SalesOrderDetails;

Para obtener más información, vea Cómo: Enlazar objetos a controles de Windows Forms (Entity Framework).

Puede crear orígenes de datos que se basen en objetos en una aplicación Visual Studio. Después de definir un tipo de entidad como un origen de datos en un proyecto, puede crear formularios que muestren los datos de Entity Framework  arrastrando los elementos desde la ventana Orígenes de datos a los formularios. En el formulario, estos elementos se convierten en controles enlazados al origen de datos. Para obtener más información, vea Data Sources Window. En tiempo de ejecución, asigna el resultado de un ObjectQuery con tipo a la propiedad DataSource de BindingSource que el origen de datos usa. Esto muestra las propiedades de los objetos que devuelve la consulta en los controles. Al igual que con el enlace de datos directo, las actualizaciones realizadas en los valores de los controles se aplican al origen de datos al llamar al método SaveChanges. Para obtener más información, vea Cómo agregar un objeto como origen de datos del proyecto (Entity Framework).

Para enlazar los objetos a un control Windows Presentation Foundation (WPF), establezca la propiedad DataContext del control al elemento EntityCollection o ObjectResult que se devuelve cuando se llama al método Execute en un objeto ObjectQuery. Use la propiedad ItemsSource para establecer el origen del objeto para el control. Si está enlazando un control a un objeto relacionado que devuelve una propiedad de navegación, incluya la ruta de acceso en el enlace definido para la propiedad ItemsSource. Esta ruta de acceso es relativa al objeto raíz establecido por la propiedad DataContext del control primario. El ejemplo siguiente establece la propiedad DataContext de un control Grid para enlazar el control a un ObjectResult:

' Execute the query and bind the result to the OrderItems control.
Me.orderItemsGrid.DataContext = CType(query, ObjectQuery).Execute(MergeOption.AppendOnly)
// Execute the query and bind the result to the OrderItems control.
this.orderItemsGrid.DataContext = ((ObjectQuery)query).Execute(MergeOption.AppendOnly);

En el ejemplo siguiente se muestra la definición de enlace XAML de los controles ComboBox y ListView secundarios:

<ComboBox DisplayMemberPath="SalesOrderID" ItemsSource="{Binding}"
          IsSynchronizedWithCurrentItem="true" 
          Height="23" Margin="122,12,198,0" Name="comboBoxOrder" VerticalAlignment="Top"/>
<ListView ItemsSource="{Binding Path=SalesOrderDetails}" Name="listViewItems" Margin="34,46,34,50">
    <ListView.View>
        <GridView AllowsColumnReorder="False" ColumnHeaderToolTip="Line Items">
            <GridViewColumn DisplayMemberBinding="{Binding Path=ProductID}" 
                Header="Product" Width="50"/>
            <GridViewColumn DisplayMemberBinding="{Binding Path=OrderQty}" 
                Header="Quantity" Width="50"/>
            <GridViewColumn DisplayMemberBinding="{Binding Path=UnitPrice}" 
                Header="Cost" Width="50"/>
            <GridViewColumn DisplayMemberBinding="{Binding Path=LineTotal}" 
                Header="Line Total" Width="80"/>
        </GridView>
    </ListView.View>
</ListView>

Para obtener más información, vea Cómo: Enlazar objetos a controles de Windows Presentation Foundation (Entity Framework).

Entity Framework incluye el control de servidor web EntityDataSource. Puede utilizar este control de origen de datos ASP.NET para enlazar los resultados de las consultas de objeto a los controles en una página web ASP.NET. Para obtener más información, vea el Ejemplo de control EntityDataSource.

Al enlazar objetos a los controles, deben tenerse en cuenta las consideraciones siguientes:

  • Se recomienda no enlazar controles directamente a ObjectQuery. En su lugar, enlace controles al resultado del método Execute. El enlace de esta manera evita que una consulta se ejecute varias veces durante el enlace.

    Bb738469.note(es-es,VS.100).gifNota:
    Si prefiere trabajar con consultas LINQ, recomendamos convertir el resultado de la consulta a ObjectQuery y llamar al método Execute.

    En el ejemplo siguiente se enlaza un elemento ComboBox al ObjectResult que se devuelve al ejecutar una consulta ObjectQuery de tipo SalesOrderHeader:

    // Create a query for orders that includes line items.
    ObjectQuery<SalesOrderHeader> orderQuery = context.SalesOrderHeaders
        .Where("it.CustomerID = @customerId", 
        new ObjectParameter("customerId", customerId))
        .Include("SalesOrderDetails");
    
    // Display the PO number in the combo box.
    this.ordersListBox.DisplayMember = "PurchaseOrderNumber";
    
    // Bind the combo box to the ObjectResult of SalesOrderHeader 
    // that is returned when the query is executed.
    this.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly);
    
  • Para asegurarse de que el origen de datos está actualizado, puede que tenga que ejecutar la consulta de nuevo con el método Execute. De esta forma enlazará el control a un nuevo ObjectResult. Debería hacer esto para asegurarse de que los datos de objeto están actualizados en los casos siguientes:

    • Los cambios se realizan en el mismo ObjectContext fuera del control enlazado.

    • Los cambios se realizan en los datos en el origen de datos.

    • Los objetos se devolvieron utilizando la opción NoTracking.

  • Puede tener acceso a objetos entidad individuales desde un control después de que se haya llevado a cabo el enlace de datos. Sin embargo, no puede tener acceso a la colección del control enlazado. Para obtener más información, vea Cómo: Enlazar objetos a controles de Windows Forms (Entity Framework).

  • Puede enlazar un EntityCollection a un control porque implementa IListSource. Sin embargo, al ejecutar el método OfType en una EntityCollection para devolver una colección de objetos de un tipo derivado, no puede enlazar directamente el elemento IEnumerable devuelto a un control. Para enlazar un control a una colección de objetos de un tipo derivado obtenido de una EntityCollection, en su lugar utilice el método CreateSourceQuery para obtener ObjectQuery que define el elemento EntityCollection base. Puede enlazar un control a la ejecución de la ObjectQuery devuelta por el método OfType en una ObjectQuery, como en el ejemplo siguiente:

    // Bind the data grid to the result of the execution of the ObjectQuery 
    // that returns only the online courses for the selected department.
    dataGridViewCourses.DataSource =
        selectedDepartment.Courses.CreateSourceQuery()
        .OfType<OnlineCourse>().Execute(MergeOption.AppendOnly);
    

    Para obtener más información, vea Cómo: Enlazar controles a tipos derivados (Entity Framework)

En esta sección

Cómo: Enlazar objetos a controles de Windows Forms (Entity Framework)

Cómo: Enlazar objetos a controles de Windows Presentation Foundation (Entity Framework)

Cómo: Enlazar controles a tipos derivados (Entity Framework)

Cómo agregar un objeto como origen de datos del proyecto (Entity Framework)

Vea también

Conceptos

Trabajar con objetos (Entity Framework)

Otros recursos

Walkthrough: Creating the Class Schedule Web Application