Enlazar objetos a controles (Entity Framework)

Servicios de objeto permite enlazar controles como ComboBox, ListView y DataGridView a un elemento EntityCollection o ObjectResult que se devuelve cuando se ejecuta ObjectQuery. Ambas clases de Entity Framework implementan la interfaz IListSource para el enlace de datos. Todos los objetos entidad derivan de la clase base StructuralObject, que implementa 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.SalesOrderDetail
// Bind the items for this order to the DataGridView.
lineItemsDataGrid.DataSource = order.SalesOrderDetail;

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 del Entity Data Model (EDM) arrastrando los elementos de la ventana Orígenes de datos a los formularios. Estos elementos se convierten en el formulario en controles que se enlazan al origen de datos. Para obtener más información, vea Ventana Orígenes de datos. 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 = query.Execute(MergeOption.AppendOnly)
// Execute the query and bind the result to the OrderItems control.
this.orderItemsGrid.DataContext = 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=SalesOrderDetail}" 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.

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

    ' Create a query for orders that includes line items.
    Dim orderQuery As ObjectQuery(Of SalesOrderHeader) = _
    context.SalesOrderHeader _
            .Where("it.CustomerID = @customerId", _
            New ObjectParameter("customerId", customerId)) _
    .Include("SalesOrderDetail")
    
    ' Bind the combo box to the ObjectResult of SalesOrderHeader 
    ' that is returned when the query is executed.
    Me.ordersListBox.DataSource = orderQuery.Execute(MergeOption.AppendOnly)
    
    // Create a query for orders that includes line items.
    ObjectQuery<SalesOrderHeader> orderQuery = context.SalesOrderHeader
        .Where("it.CustomerID = @customerId", 
        new ObjectParameter("customerId", customerId))
        .Include("SalesOrderDetail");
    
    // 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 de 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 del elemento ObjectQuery que devuelve el método OfType en ObjectQuery.

Vea también

Conceptos

Métodos de restricción y proyección (LINQ to Entities)

Otros recursos

Trabajar con objetos (Entity Framework)
Tutorial: crear la aplicación web Course Manager