Liaison d'objets à des contrôles (Entity Framework)
Entity Framework vous permet de lier des contrôles tels que ComboBox, ListView et DataGridView à un EntityCollection ou à un ObjectResult retourné suite à l'exécution d'un ObjectQuery. Les deux classes Entity Framework implémentent l'interface IListSource pour la liaison de données. Les types d'entité générés par les outils Entity Framework implémentent 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.SalesOrderDetails;
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 à partir d'Entity Framework en faisant glisser les éléments de la fenêtre Sources de données vers les formulaires. Ces éléments deviennent dans le formulaire des contrôles liés à la source de données. Pour plus d'informations, voir Data Sources Window. 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 = 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);
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=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>
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.
Remarque : Si vous préférez utiliser des requêtes LINQ, nous vous recommandons d'effectuer un cast du résultat de la requête en ObjectQuery et d'appeler la méthode Execute. 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. 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);
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'objet ObjectQuery retourné par la méthode OfType sur une classe ObjectQuery, comme dans l'exemple suivant :
// 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);
Pour plus d'informations, consultez Procédure : lier des contrôles à des types dérivés (Entity Framework).
Dans cette section
Procédure : lier des objets à des contrôles Windows Form (Entity Framework)
Procédure : lier des objets à des contrôles Windows Presentation Foundation (Entity Framework)
Procédure : lier des contrôles à des types dérivés (Entity Framework)
Procédure : ajouter un objet en tant que source de données de projet (Entity Framework)
Voir aussi
Concepts
Utilisation d'objets (Entity Framework)