Binden von Objekten an Steuerelemente (Entity Framework)
Mit Object Services können Steuerelemente, wie z. B. ComboBox, ListView und DataGridView, an eine EntityCollection oder an ein ObjectResult gebunden werden. Letzteres wird zurückgegeben, wenn eine ObjectQuery ausgeführt wird. Beide Entity Framework-Klassen implementieren die IListSource-Schnittstelle für Datenbindung. Alle Entitätsobjekte sind von der StructuralObject-Basisklasse abgeleitet, die INotifyPropertyChanged implementiert. Das ermöglicht eine bidirektionale Datenbindung zwischen Objekteigenschaften und Steuerelementen, sodass Aktualisierungen der Steuerelemente zurück an die Eigenschaften des gebundenen Objekts übertragen werden.
Um Objekte an ein Windows Form-Steuerelement zu binden, legen Sie die DataSource-Eigenschaft des Steuerelements auf EntityCollection oder ObjectResult fest. Letzteres wird zurückgegeben, wenn die Execute-Methode für ein ObjectQuery-Objekt aufgerufen wird. Im folgenden Beispiel wird eine EntityCollection an ein DataGridView-Steuerelement gebunden:
' 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;
Weitere Informationen finden Sie unter Gewusst wie: Binden von Objekten an Windows Form-Steuerelemente (Entity Framework).
Sie können Datenquellen erstellen, die auf den Objekten einer Visual Studio-Anwendung basieren. Nachdem Sie einen Entitätstyp als eine Datenquelle in einem Projekt definiert haben, können Sie Formulare erstellen, die Entity Data Model (EDM)-Daten anzeigen, indem Sie Elemente aus dem Fenster Datenquellen auf die Formulare ziehen. Diese Elemente werden Steuerelemente auf dem Formular, die an die Datenquelle gebunden sind. Weitere Informationen finden Sie unter Datenquellenfenster. Zur Laufzeit weisen Sie das Ergebnis einer typisierten ObjectQuery der DataSource-Eigenschaft der von der Datenquelle verwendeten BindingSource zu. Dadurch werden die Eigenschaften der Objekte angezeigt, die von der Abfrage in den Steuerelementen zurückgegeben werden. Wie bei der direkten Datenbindung speichern Sie Aktualisierungen der Werte von Steuerelementen in der Datenquelle, wenn Sie die SaveChanges-Methode aufrufen. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen eines Objekts als Projektdatenquelle (Entity Framework).
Um Objekte an ein Windows Presentation Foundation (WPF)-Steuerelement zu binden, legen Sie die DataContext-Eigenschaft des Steuerelements auf EntityCollection oder ObjectResult fest. Letzteres wird zurückgegeben, wenn die Execute-Methode für ein ObjectQuery-Objekt aufgerufen wird. Mit der ItemsSource-Eigenschaft können Sie die Objektquelle für das Steuerelement festlegen. Wenn Sie ein Steuerelement an ein entsprechendes Objekt binden, das durch eine Navigationseigenschaft zurückgegeben wird, schließen Sie den für die ItemsSource-Eigenschaft definierten Pfad in die Bindung ein. Dieser Pfad ist relativ zum Stammobjekt, das von der DataContext-Eigenschaft des übergeordneten Steuerelements festgelegt wird. Im folgenden Beispiel wird die DataContext-Eigenschaft eines Grid-Steuerelements so festgelegt, dass das Steuerelement an ObjectResult gebunden wird:
' 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);
Das folgende Beispiel zeigt die XAML-Bindungsdefinition des untergeordneten ListView-Steuerelements und des untergeordneten ComboBox-Steuerelements:
<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>
Weitere Informationen finden Sie unter Gewusst wie: Binden von Objekten an Windows Presentation Foundation-Steuerelemente (Entity Framework).
Entity Framework beinhaltet das EntityDataSource-Webserver-Steuerelement. Sie können dieses ASP.NET-Datenquellen-Steuerelement verwenden, um die Ergebnisse von Objektabfragen an Steuerelemente auf einer ASP.NET-Webseite zu binden. Weitere Informationen finden Sie im Beispiel zum EntityDataSource-Steuerelement.
Folgendes gilt beim Binden von Objekten an Steuerelemente:
Es wird empfohlen, Steuerelemente nicht direkt an eine ObjectQuery zu binden. Stattdessen sollten die Steuerelemente an das Ergebnis der Execute-Methode gebunden werden. Die auf diese Weise vorgenommene Bindung verhindert, dass eine Abfrage während des Bindens mehrmals ausgeführt wird.
Im folgenden Beispiel wird eine ComboBox an das ObjectResult gebunden, das beim Ausführen einer ObjectQuery vom Typ SalesOrderHeader zurückgegeben wird:
' 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);
Um sicherzustellen, dass die Datenquelle die aktuellen Daten enthält, müssen Sie die Abfrage möglicherweise unter Verwendung der Execute-Methode erneut ausführen. Dadurch wird das Steuerelement an ein neues ObjectResult gebunden. Auf diese Weise sollten Sie sicherstellen, dass die Objektdaten in den folgenden Fällen aktuell sind:
Derselbe ObjectContext wird außerhalb des gebundenen Steuerelements geändert.
Die Daten in der Datenquelle werden geändert.
Objekte wurden unter Verwendung der NoTracking-Option zurückgegeben.
Nach der Datenbindung kann von einem Steuerelement aus auf einzelne Entitätsobjekte zugegriffen werden. Sie können jedoch nicht vom gebundenen Steuerelement aus auf die Auflistung zugreifen. Weitere Informationen finden Sie unter Gewusst wie: Binden von Objekten an Windows Form-Steuerelemente (Entity Framework).
Sie können eine EntityCollection an ein Steuerelement binden, da es IListSource implementiert. Wenn Sie jedoch die OfType-Methode für eine EntityCollection ausführen, um eine Auflistung von Objekten eines abgeleiteten Typs zurückzugeben, können Sie die zurückgegebene IEnumerable nicht direkt an ein Steuerelement binden. Um ein Steuerelement an eine Auflistung von Objekten eines abgeleiteten Typs zu binden, die von einer EntityCollection abgerufen wurde, können Sie stattdessen die CreateSourceQuery-Methode verwenden. So erhalten Sie die ObjectQuery, die die Basis-EntityCollection definiert. Sie können ein Steuerelement an die Ausführung der ObjectQuery binden, die von der OfType-Methode einer ObjectQuery zurückgegeben wird.
Siehe auch
Konzepte
Projektions- und Einschränkungsmethoden (LINQ to Entities)
Weitere Ressourcen
Arbeiten mit Objekten (Entity Framework)
Exemplarische Vorgehensweise: Erstellen der CourseManagerWeb-Anwendung