Поделиться через


Пошаговое руководство. Изменение данных в службе домена

В этом пошаговом руководстве описывается создание интерфейса, позволяющего пользователю изменить отображаемые данные и сохранить изменения в базах данных.

При добавлении методов обновления, вставки или удаления в службе домена можно создать интерфейс в клиенте Silverlight, поддерживающем изменение данных пользователями. Все изменения отслеживаются в объекте EntityChangeSet, а изменения передаются не по отдельности, а в совокупности при вызове метода SubmitChanges.

Предварительные требования

Для использования этого и других пошаговых руководств, представленных в документации Службы WCF RIA, необходимо установить и правильно настроить ряд обязательных программ, таких как среда выполнения Visual Studio 2010 и пакет SDK Silverlight, а также Службы WCF RIA и набор средств Службы WCF RIA. Для их использования также необходимо установить и настроить SQL Server 2008 R2, экспресс-выпуск с дополнительными службами, и установить базы данных AdventureWorks OLTP и LT.

Подробные инструкции по выполнению каждого из этих предварительных требований приведены в разделах узла Основные компоненты для службы WCF полнофункционального интернет-приложения. До начала использования этого пошагового руководства необходимо выполнить приведенные ниже инструкции, что позволит уменьшить количество проблем, которые могут возникнуть при выполнении шагов, описанных в руководствах Службы RIA .

Это пошаговое руководство предполагает знакомство с Пошаговое руководство. Создание служб полнофункционального интернет-приложения и доступ к ним и продолжение работы с приложением, созданным с использованием процедур, описанных ниже.

Отображение и изменение данных из службы домена

  1. Откройте решение RIAServicesExample из Пошаговое руководство. Создание служб полнофункционального интернет-приложения и доступ к ним.

  2. В MainPage.xaml измените интерфейс, чтобы обеспечить для пользователя возможность сохранения и отклонения изменений в DataGrid.

    Следующий код XAML добавляет кнопки Сохранить изменения и Отклонить изменения и блок текста.

    <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. На странице с выделенным кодом для MainPage.xaml добавьте обработчики событий для событий нажатия кнопок, обработчик для события RowEditEnded, метод обратного вызова с именем OnSubmitCompleted и метод, оценивающий отложенные изменения.

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

Настройка обновляемых метаданных для сущности

  1. В серверном проекте откройте класс метаданных с именем Customer.metadata.cs или Customer.metadata.vb.

    Дополнительные сведения см. в разделе Как добавить классы сущностей.

  2. В классе метаданных добавьте атрибут EditableAttribute со свойством AllowEdit, для которого задано значение false, к свойствам CustomerID и ModifiedDate.

    Атрибут EditableAttribute применяется к свойству для указания на то, будет ли свойство изменяться пользователем в клиентском приложении. При задании для свойства AllowEdit значения false свойство становится в клиентском приложении доступным только для чтения. В этом примере отображаются значения для свойств CustomerID и ModifiedDate, однако пользователю запрещается изменять эти значения.

  3. Добавьте атрибут ExcludeAttribute к свойству rowguid.

    Атрибут ExcludeAttribute применяется к свойствам, которые не нужно включать в формируемый код для клиентского проекта. В этом примере предоставление свойства rowguid в клиентском проекте является нецелесообразным.

    В следующем примере описывается содержимое класса метаданных.

    <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. Добавьте обязательные инструкции using или Imports для таких пространств имен, как System.ComponentModel.DataAnnotations и System.ServiceModel.DomainServices.Server.

  5. Запустите приложение (F5).

    Обратите внимание, что значения в DataGrid можно изменять. При выходе из измененной строки значение ChangeText обновляется с использованием описания отложенных изменений. При нажатии кнопки «Сохранить изменения» изменения данных сохраняются в базе данных. При нажатии кнопки «Отклонить изменения» вместо всех отложенных изменений восстанавливаются прежние значения.