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

  1. Öffnen Sie die in Exemplarische Vorgehensweise: Erstellen einer RIA Services-Projektmappe erstellte Projektmappe "RIAServicesExample".

  2. Ä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>
    
  3. 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

  1. Ö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.

  2. Fügen Sie in der Metadatenklasse den CustomerID- und ModifiedDate-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- und ModifiedDate-Eigenschaften an, Sie möchten aber nicht, dass der Benutzer diese Werte ändert.

  3. 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;
    
        }
    }
    
  4. Fügen Sie die erforderlichen using- oder Imports-Anweisungen für Namespaces hinzu, z. B. System.ComponentModel.DataAnnotations und System.ServiceModel.DomainServices.Server.

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