Пошаговое руководство. Изменение данных в службе домена
В этом пошаговом руководстве описывается создание интерфейса, позволяющего пользователю изменить отображаемые данные и сохранить изменения в базах данных.
При добавлении методов обновления, вставки или удаления в службе домена можно создать интерфейс в клиенте Silverlight, поддерживающем изменение данных пользователями. Все изменения отслеживаются в объекте EntityChangeSet, а изменения передаются не по отдельности, а в совокупности при вызове метода SubmitChanges.
Предварительные требования
Для использования этого и других пошаговых руководств, представленных в документации Службы WCF RIA, необходимо установить и правильно настроить ряд обязательных программ, таких как среда выполнения Visual Studio 2010 и пакет SDK Silverlight, а также Службы WCF RIA и набор средств Службы WCF RIA. Для их использования также необходимо установить и настроить SQL Server 2008 R2, экспресс-выпуск с дополнительными службами, и установить базы данных AdventureWorks OLTP и LT.
Подробные инструкции по выполнению каждого из этих предварительных требований приведены в разделах узла Основные компоненты для службы WCF полнофункционального интернет-приложения. До начала использования этого пошагового руководства необходимо выполнить приведенные ниже инструкции, что позволит уменьшить количество проблем, которые могут возникнуть при выполнении шагов, описанных в руководствах Службы RIA .
Это пошаговое руководство предполагает знакомство с Пошаговое руководство. Создание служб полнофункционального интернет-приложения и доступ к ним и продолжение работы с приложением, созданным с использованием процедур, описанных ниже.
Отображение и изменение данных из службы домена
Откройте решение RIAServicesExample из Пошаговое руководство. Создание служб полнофункционального интернет-приложения и доступ к ним.
В 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>
На странице с выделенным кодом для 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(); }
Настройка обновляемых метаданных для сущности
В серверном проекте откройте класс метаданных с именем Customer.metadata.cs или Customer.metadata.vb.
Дополнительные сведения см. в разделе Как добавить классы сущностей.
В классе метаданных добавьте атрибут EditableAttribute со свойством AllowEdit, для которого задано значение false, к свойствам
CustomerID
иModifiedDate
.Атрибут EditableAttribute применяется к свойству для указания на то, будет ли свойство изменяться пользователем в клиентском приложении. При задании для свойства AllowEdit значения false свойство становится в клиентском приложении доступным только для чтения. В этом примере отображаются значения для свойств
CustomerID
иModifiedDate
, однако пользователю запрещается изменять эти значения.Добавьте атрибут 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; } }
Добавьте обязательные инструкции using или Imports для таких пространств имен, как System.ComponentModel.DataAnnotations и System.ServiceModel.DomainServices.Server.
Запустите приложение (F5).
Обратите внимание, что значения в DataGrid можно изменять. При выходе из измененной строки значение
ChangeText
обновляется с использованием описания отложенных изменений. При нажатии кнопки «Сохранить изменения» изменения данных сохраняются в базе данных. При нажатии кнопки «Отклонить изменения» вместо всех отложенных изменений восстанавливаются прежние значения.