Exemplarische Vorgehensweise: Bearbeiten von Daten von einem Domänendienst
In dieser exemplarischen Vorgehensweise erfahren Sie, wie Sie eine Schnittstelle erstellen, die es dem Benutzer ermöglicht, die angezeigten Daten zu ändern und diese Änderungen in den Datenbanken zu speichern.
Wenn Sie Update-, Einfüge- oder Löschmethoden in einem Domänendienst hinzugefügt haben, können Sie eine Schnittstelle in einem Silverlight-Client erstellen, die Benutzern das Ändern der Daten ermöglicht. Alle Änderungen werden in einem EntityChangeSet-Objekt nachverfolgt, und die Änderungen werden gemeinsam gesendet, wenn Sie die SubmitChanges-Methode aufrufen.
Erforderliche Komponenten
Für diese und die anderen exemplarischen Vorgehensweisen in der WCF RIA Services-Dokumentation müssen zusätzlich zu WCF RIA Services und dem WCF RIA Services-Toolkit mehrere erforderliche Programme installiert und korrekt konfiguriert werden, z. B. Visual Studio 2010, die Silverlight Developer-Laufzeit und das Silverlight-SDK. Zudem müssen Sie SQL Server 2008 R2 Express with Advanced Services installieren und konfigurieren und die AdventureWorks OLTP- und LT-Datenbanken installieren.
Ausführliche Anweisungen für jede dieser erforderlichen Komponenten finden Sie in den Themen unter Erforderliche Komponenten für WCF RIA Services. Folgen Sie den Anweisungen in diesen Themen, bevor Sie mit dieser exemplarischen Vorgehensweise fortfahren, um sicherzustellen, dass beim Ausführen der exemplarischen Vorgehensweisen für RIA Services so wenig Probleme wie möglich auftreten.
Diese exemplarische Vorgehensweise setzt voraus, dass Sie Exemplarische Vorgehensweise: Erstellen einer RIA Services-Projektmappe ausgeführt haben, und basiert auf der Anwendung, die in den dort beschriebenen Verfahren erstellt wurde.
So zeigen Sie Daten von einem Domänendienst an und bearbeiten Sie sie
Öffnen Sie die in Exemplarische Vorgehensweise: Erstellen einer RIA Services-Projektmappe erstellte Projektmappe "RIAServicesExample".
Ändern Sie in "MainPage.xaml" die Schnittstelle, um dem Benutzer das Speichern oder Ablehnen von Änderungen im DataGrid zu ermöglichen.
Durch den folgenden XAML-Code werden eine Schaltfläche Save Changes, eine Schaltfläche Reject Changes und ein Textblock hinzugefügt.
<Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="40"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <StackPanel HorizontalAlignment="Center" Grid.Row="0" Orientation="Horizontal"> <Button Content="Save Changes" Click="SaveButton_Click" Margin="5" x:Name="SaveButton"></Button> <Button Content="Reject Changes" Click="RejectButton_Click" Margin="5" x:Name="RejectButton"></Button> <TextBlock x:Name="ChangeText" VerticalAlignment="Center" Width="Auto"></TextBlock> </StackPanel> <data:DataGrid Grid.Row="1" Name="CustomerGrid" RowEditEnded="CustomerGrid_RowEditEnded"></data:DataGrid> </Grid>
Fügen Sie in der CodeBehind-Seite für "MainPage.xaml" Ereignishandler für die Click-Ereignisse für Schaltflächen, einen Ereignishandler für das RowEditEnded-Ereignis, eine Rückrufmethode mit dem Namen
OnSubmitCompleted
und eine Methode zum Auswerten der ausstehenden Änderungen hinzu.Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) _customerContext.SubmitChanges(AddressOf OnSubmitCompleted, Nothing) End Sub Private Sub RejectButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) _customerContext.RejectChanges() CheckChanges() End Sub Private Sub CustomerGrid_RowEditEnded(ByVal sender As System.Object, ByVal e As System.Windows.Controls.DataGridRowEditEndedEventArgs) CheckChanges() End Sub Private Sub CheckChanges() Dim changeSet = _customerContext.EntityContainer.GetChanges() ChangeText.Text = changeSet.ToString() Dim hasChanges = _customerContext.HasChanges SaveButton.IsEnabled = hasChanges RejectButton.IsEnabled = hasChanges End Sub Private Sub OnSubmitCompleted(ByVal so As SubmitOperation) If (so.HasError) Then MessageBox.Show(String.Format("Submit Failed: {0}", so.Error.Message)) so.MarkErrorAsHandled() End If CheckChanges() End Sub
private void SaveButton_Click(object sender, RoutedEventArgs e) { _customerContext.SubmitChanges(OnSubmitCompleted, null); } private void RejectButton_Click(object sender, RoutedEventArgs e) { _customerContext.RejectChanges(); CheckChanges(); } private void CustomerGrid_RowEditEnded(object sender, DataGridRowEditEndedEventArgs e) { CheckChanges(); } private void CheckChanges() { EntityChangeSet changeSet = _customerContext.EntityContainer.GetChanges(); ChangeText.Text = changeSet.ToString(); bool hasChanges = _customerContext.HasChanges; SaveButton.IsEnabled = hasChanges; RejectButton.IsEnabled = hasChanges; } private void OnSubmitCompleted(SubmitOperation so) { if (so.HasError) { MessageBox.Show(string.Format("Submit Failed: {0}", so.Error.Message)); so.MarkErrorAsHandled(); } CheckChanges(); }
So legen Sie Metadaten für die zu aktualisierende Entität fest
Öffnen Sie im Serverprojekt die Metadatenklasse mit dem Namen "Customer.metadata.cs" bzw. "Customer.metadata.vb".
Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen von Metadatenklassen.
Fügen Sie in der Metadatenklasse den
CustomerID
- undModifiedDate
-Eigenschaften das EditableAttribute-Attribut mit dem AllowEdit-Eigenschaftswert false hinzu.Das EditableAttribute-Attribut wird auf eine Eigenschaft angewendet, um anzugeben, ob das Bearbeiten der Eigenschaft durch einen Benutzer in der Clientanwendung möglich sein soll. Wenn Sie die AllowEdit-Eigenschaft auf false festlegen, ist die Eigenschaft in der Clientanwendung schreibgeschützt. In diesem Beispiel zeigen Sie die Werte für die
CustomerID
- undModifiedDate
-Eigenschaften an, Sie möchten aber nicht, dass der Benutzer diese Werte ändert.Fügen Sie der
rowguid
-Eigenschaft das ExcludeAttribute-Attribut hinzu.Das ExcludeAttribute-Attribut wird auf Eigenschaften angewendet, die Sie nicht in den generierten Code für das Clientprojekt einschließen möchten. In diesem Beispiel besteht kein Grund, die
rowguid
-Eigenschaft im Clientprojekt verfügbar zu machen.Das folgende Beispiel zeigt den Inhalt der Metadatenklasse.
<MetadataTypeAttribute(GetType(Customer.CustomerMetadata))> _ Partial Public Class Customer Friend NotInheritable Class CustomerMetadata 'Metadata classes are not meant to be instantiated. Private Sub New() MyBase.New End Sub <Editable(False)> _ Public CustomerID As Integer <Editable(False)> _ Public ModifiedDate As DateTime <Exclude()> _ Public rowguid As Guid End Class End Class
[MetadataTypeAttribute(typeof(Customer.CustomerMetadata))] public partial class Customer { internal sealed class CustomerMetadata { // Metadata classes are not meant to be instantiated. private CustomerMetadata() { } [Editable(false)] public int CustomerID; [Editable(false)] public DateTime ModifiedDate; [Exclude] public Guid rowguid; } }
Fügen Sie die erforderlichen using- oder Imports-Anweisungen für Namespaces hinzu, z. B. System.ComponentModel.DataAnnotations und System.ServiceModel.DomainServices.Server.
Führen Sie die Anwendung aus (F5).
Die Werte im DataGrid können bearbeitet werden. Wenn Sie die bearbeitete Zeile verlassen, wird der
ChangeText
-Wert mit einer Beschreibung der ausstehenden Änderungen aktualisiert. Wenn Sie auf die Schaltfläche "Save Changes" klicken, werden die Datenänderungen in der Datenbank gespeichert. Wenn Sie auf die Schaltfläche "Reject Changes" klicken, werden alle ausstehenden Änderungen wiederhergestellt.