Tutorial: editar datos de un servicio de dominio

En este tutorial, aprenderá a crear una interfaz que permite al usuario cambiar los datos mostrados y guardar los cambios en las bases de datos.

Cuando haya agregado métodos de actualización, inserción o eliminación en un servicio de dominio, podrá crear una interfaz en un cliente de Silverlight que permita a los usuarios cambiar los datos. Se realiza un seguimiento de todos los cambios en un objeto EntityChangeSet y los cambios se envían colectivamente cuando se llama al método SubmitChanges.

Requisitos previos

Este tutorial y los demás tutoriales presentados en la documentación de WCF RIA Services requieren la instalación y configuración correctas de varios programas de requisitos previos, como Visual Studio 2010 y Silverlight Developer Runtime y SDK, además de WCF RIA Services y el Kit de herramientas de WCF RIA Services. También requieren la instalación y configuración de SQL Server 2008 R2 Express con Advanced Services, así como la instalación de las bases de datos OLTP y LT de AdventureWorks.

Los temas del nodo Requisitos previos para WCF RIA Services proporcionan instrucciones detalladas para el cumplimiento de cada uno de estos requisitos previos. Siga las instrucciones proporcionadas en ellos antes de realizar este tutorial para asegurarse de encontrar el menor número de problemas posibles al trabajar en estos tutoriales de RIA Services .

En este tutorial se supone que ha completado Tutorial: crear una solución de RIA Services y se continúa desde la aplicación creada con los procedimientos descritos en él.

Para mostrar y editar los datos de un servicio de dominio

  1. Abra la solución RIAServicesExample de Tutorial: crear una solución de RIA Services.

  2. En MainPage.xaml, cambie la interfaz para permitir al usuario guardar o rechazar cambios en el elemento DataGrid.

    El siguiente código XAML agrega un botón Guardar cambios, un botón Rechazar cambios y un bloque de texto.

    <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. En la página de código subyacente para MainPage.xaml, agregue controladores de eventos para los eventos Click de botón, un controlador de eventos para el evento RowEditEnded, un método de devolución de llamada denominado OnSubmitCompleted y un método que evalúe los cambios pendientes.

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

Para establecer los metadatos para la entidad que se va a actualizar

  1. En el proyecto de servidor, abra la clase de metadatos denominada Customer.metadata.cs o Customer.metadata.vb.

    Para obtener más información, vea Agregar clases de metadatos.

  2. En la clase de metadatos, agregue el atributo EditableAttribute con la propiedad AllowEdit establecida en false a las propiedades ModifiedDate y CustomerID.

    Aplique el atributo EditableAttribute a una propiedad para indicar si está previsto que un usuario edite la propiedad en una aplicación cliente. Cuando establezca la propiedad AllowEdit en false, la propiedad será de solo lectura en la aplicación cliente. En este ejemplo, mostrará los valores para las propiedades ModifiedDate y CustomerID pero no permitirá que el usuario modifique estos valores.

  3. Agregue el atributo ExcludeAttribute a la propiedad rowguid.

    Aplique el atributo ExcludeAttribute a las propiedades que no desea incluir en el código generado para el proyecto de cliente. En este ejemplo, no hay ninguna razón para exponer la propiedad rowguid en el proyecto de cliente.

    En el ejemplo siguiente se muestra el contenido de la clase de metadatos.

    <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. Agregue las instrucciones Imports o using requeridas para los espacios de nombres, como System.ComponentModel.DataAnnotations y System.ServiceModel.DomainServices.Server.

  5. Ejecute (F5) la aplicación.

    Observe que puede editar los valores en el elemento DataGrid. Cuando salga de la fila que ha editado, el valor ChangeText se habrá actualizado con una descripción de los cambios pendientes. Cuando haga clic en el botón Guardar cambios, los cambios de datos se guardarán en la base de datos. Cuando haga clic en el botón Rechazar cambios, se revertirán todos los cambios pendientes.