Liaison d'objets à des contrôles (Entity Framework)

Object Services vous permet de lier des contrôles tels que ComboBox, ListView et DataGridView à un EntityCollection ou un ObjectResult retourné lorsqu'un ObjectQuery est exécuté. Les deux classes Entity Framework implémentent l'interface IListSource pour la liaison de données. Tous les objets entité dérivent de la classe de base StructuralObject qui implémente INotifyPropertyChanged. Cela permet la liaison de données bidirectionnelle entre les propriétés des objets et les contrôles, de sorte que les mises à jour des contrôles se répercutent sur les propriétés de l'objet lié.

Pour lier des objets à un contrôle Windows Form, affectez à la propriété DataSource du contrôle l'EntityCollection ou l'ObjectResult retourné lorsque la méthode Execute est appelée sur un objet ObjectQuery. L'exemple suivant lie un objet EntityCollection à un contrôle 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;

Pour plus d'informations, voir Procédure : lier des objets à des contrôles Windows Form (Entity Framework).

Vous pouvez créer des sources de données basées sur vos objets dans une application Visual Studio. Après avoir défini un type d'entité en tant que source de données dans un projet, vous pouvez créer des formulaires qui affichent des données EDM (Entity Data Model) en faisant glisser des éléments de la fenêtre Sources de données vers des formulaires. Ces éléments deviennent dans le formulaire des contrôles liés à la source de données. Pour plus d'informations, voir Sources de données, fenêtre. Au moment de l'exécution, vous attribuez le résultat d'un ObjectQuery typé à la propriété DataSource du BindingSource utilisé par la source de données. Les propriétés des objets retournés par la requête s'affichent alors dans les contrôles. Comme avec la liaison de données directe, vous appliquez à la source de données les mises à jour apportées aux valeurs de contrôles lorsque vous appelez la méthode SaveChanges. Pour plus d'informations, voir Procédure : ajouter un objet en tant que source de données de projet (Entity Framework).

Pour lier des objets à un contrôle Windows Presentation Foundation (WPF), affectez à la propriété DataContext du contrôle l'EntityCollection ou l'ObjectResult retourné lorsque la méthode Execute est appelée sur un objet ObjectQuery. Utilisez la propriété ItemsSource pour définir la source de l'objet pour le contrôle. Si vous liez un contrôle à un objet connexe retourné par une propriété de navigation, incluez le chemin d'accès dans la liaison définie pour la propriété ItemsSource. Ce chemin d'accès est relatif à l'objet racine défini par la propriété DataContext du contrôle parent. L'exemple suivant définit la propriété DataContext d'un contrôle Grid pour lier le contrôle à 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);

L'exemple suivant montre la définition XAML de la liaison des contrôles enfants ListView et ComboBox :

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

Pour plus d'informations, voir Procédure : lier des objets à des contrôles Windows Presentation Foundation (Entity Framework).

Entity Framework inclut le contrôle serveur Web EntityDataSource. Vous pouvez utiliser ce contrôle de source de données ASP.NET pour lier les résultats de requêtes d'objet aux contrôles d'une page Web ASP.NET. Pour plus d'informations, voir l'exemple de contrôle EntityDataSource.

Vous devez tenir compte des points suivants lors de la liaison d'objets à des contrôles :

  • Nous vous recommandons de ne pas lier directement des contrôles à un ObjectQuery. Il est préférable de les lier au résultat de la méthode Execute. Cette façon de procéder empêche qu'une requête soit exécutée à plusieurs reprises au cours de la liaison.

    L'exemple suivant lie un ComboBox à l'ObjectResult retourné suite à l'exécution d'un ObjectQuery de type 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);
    
  • Pour garantir que la source de données est à jour, vous devrez peut-être réexécuter la requête à l'aide de la méthode Execute. Le contrôle sera ainsi lié à un nouvel ObjectResult. Cette opération est nécessaire pour être certain de disposer de données d'objet à jour dans les cas suivants :

    • Des modifications sont apportées au même ObjectContext en dehors du contrôle dépendant.

    • Des modifications sont apportées aux données de la source de données.

    • Des objets ont été retournés à l'aide de l'option NoTracking.

  • Vous pouvez accéder à des objets entité individuels à partir d'un contrôle une fois la liaison de données réalisée. Toutefois, vous ne pouvez pas accéder à la collection à partir du contrôle dépendant. Pour plus d'informations, voir Procédure : lier des objets à des contrôles Windows Form (Entity Framework).

  • Vous pouvez lier un EntityCollection à un contrôle parce qu'il implémente IListSource. Toutefois, lorsque vous exécutez la méthode OfType sur un EntityCollection pour retourner une collection d'objets d'un type dérivé, vous ne pouvez pas lier l'IEnumerable retourné directement à un contrôle. Pour lier un contrôle à une collection d'objets d'un type dérivé obtenu d'un EntityCollection, utilisez plutôt la méthode CreateSourceQuery pour obtenir l'ObjectQuery qui définit l'EntityCollection de base. Vous pouvez lier un contrôle à l'exécution de l'ObjectQuery retourné par la méthode OfType d'un ObjectQuery.

Voir aussi

Concepts

Méthodes de projection et de restriction (LINQ to Entities)

Autres ressources

Utilisation d'objets (Entity Framework)
Procédure pas à pas : création de l'application Web CourseManager