Condividi tramite


Procedura dettagliata: modifica dei dati da un servizio del dominio

In questa procedura dettagliata viene descritto come creare un'interfaccia che consente all'utente di modificare i dati visualizzati e salvare le modifiche nei database.

Una volta aggiunti i metodi di aggiornamento, inserimento o eliminazione in un servizio del dominio, è possibile creare in un client Silverlight un'interfaccia che consenta agli utenti di modificare i dati. Tutte le modifiche vengono registrate in un oggetto EntityChangeSet e vengono inviate collettivamente quando si chiama il metodo SubmitChanges.

Prerequisiti

Per l'esecuzione di questa e di altre procedure dettagliate descritte nella documentazione di WCF RIA Services è necessario che siano installati e configurati correttamente alcuni programmi prerequisiti quali Visual Studio 2010 e Silverlight Developer Runtime e SDK, oltre a WCF RIA Services e a WCF RIA Services Toolkit. È inoltre richiesta l'installazione e la configurazione di SQL Server 2008 R2 Express with Advanced Services e l'installazione del database AdventureWorks OLTP e LT.

Le istruzioni dettagliate per soddisfare tali prerequisiti vengono fornite negli argomenti all'interno del nodo Prerequisiti per WCF RIA Services. Seguire tali istruzioni prima di continuare con questa procedura dettagliata in modo da assicurarsi che si verifichi il minor numero possibile di problemi durante l'esecuzione della procedura dettagliata di RIA Services .

Per questa procedura dettagliata si presuppone che la Procedura dettagliata: creazione di una soluzione Servizi RIA sia stata completata e che si utilizzi l'applicazione creata con le procedure descritte.

Per visualizzare e modificare i dati da un servizio del dominio

  1. Aprire la soluzione RIAServicesExample da Procedura dettagliata: creazione di una soluzione Servizi RIA.

  2. In MainPage.xaml, modificare l'interfaccia per consentire all'utente di salvare o rifiutare le modifiche nell'elemento DataGrid.

    Il seguente codice XAML consente di aggiungere un pulsante Save Changes, un pulsante Reject Changes e un blocco di testo.

    <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. Nella pagina code-behind per MainPage.xaml, aggiungere i gestori per gli eventi clic sul pulsante, un gestore eventi per l'evento RowEditEnded, un metodo di callback denominato OnSubmitCompleted e un metodo che valuta le modifiche in sospeso.

    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();
    }
    

Per impostare i metadati per l'entità da aggiornare

  1. Nel progetto server, aprire la classe di metadati denominata Customer.metadata.cs o Customer.metadata.vb.

    Per ulteriori informazioni, vedere Procedura: aggiungere classi di metadati.

  2. Nella classe di metadati, aggiungere l'attributo EditableAttribute con la proprietà AllowEdit impostata su false alle proprietà CustomerID e ModifiedDate.

    L'attributo EditableAttribute viene applicato a una proprietà per indicare se la proprietà è progettata per la modifica da parte di un utente in un'applicazione client. Quando si imposta la proprietà AllowEdit su false, la proprietà è di sola lettura nell'applicazione client. In questo esempio, si visualizzeranno i valori per le proprietà CustomerID e ModifiedDate ma si permetterà che l'utente modifichi questi valori.

  3. Aggiungere l'attributo ExcludeAttribute alla proprietà rowguid.

    Applicare l'attributo ExcludeAttribute alle proprietà che non si desidera vengano incluse nel codice generato per il progetto client. In questo esempio, non c'è alcun motivo per esporre la proprietà rowguid nel progetto client.

    Di seguito viene illustrato il contenuto della classe di metadati.

    <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. Aggiungere le istruzioni using o Imports necessarie per gli spazi dei nomi, quali System.ComponentModel.DataAnnotations e System.ServiceModel.DomainServices.Server.

  5. Eseguire (F5) l'applicazione.

    Notare che è possibile modificare i valori nell'elemento DataGrid. Una volta usciti dalla riga modificata, il valore ChangeText viene aggiornato con una descrizione delle modifiche in sospeso. Quando si fa clic sul pulsante Save Changes le modifiche ai dati vengono salvate nel database. Quando si fa clic sul pulsante Reject Changes, vengono ripristinate tutte le modifiche in sospeso.