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
Abra la solución RIAServicesExample de Tutorial: crear una solución de RIA Services.
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>
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
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.
En la clase de metadatos, agregue el atributo EditableAttribute con la propiedad AllowEdit establecida en false a las propiedades
ModifiedDate
yCustomerID
.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
yCustomerID
pero no permitirá que el usuario modifique estos valores.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; } }
Agregue las instrucciones Imports o using requeridas para los espacios de nombres, como System.ComponentModel.DataAnnotations y System.ServiceModel.DomainServices.Server.
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.