Share via


逐步解說:編輯網域服務的資料

在本逐步解說中,您將了解如何建立介面,讓使用者變更顯示的資料並將這些變更儲存在資料庫中。

在網域服務中已加入更新、插入或刪除方法時,就可以在 Silverlight 用戶端中建立介面,讓使用者變更資料。在 EntityChangeSet 物件中會追蹤所有的變更,而當呼叫 SubmitChanges 方法時會一併送出變更。

必要條件

除了 WCF RIA Services 和 WCF RIA Services 工具組之外,在 WCF RIA Services 文件中呈現的這個逐步解說和其他逐步解說還需要正確安裝並設定數個必要程式 (例如 Visual Studio 2010 和 Silverlight 開發人員執行階段與 SDK)。要執行逐步解說還需要安裝並設定 SQL Server 2008 R2 Express with Advanced Services,以及安裝 AdventureWorks OLTP 和 LT 資料庫。

WCF RIA Services 的必要條件節點中的主題也提供符合這些必要條件的詳細指示。請先按照該處提供的指示進行,然後再進行本逐步解說,以確保您在進行本 RIA Services 逐步解說時不會發生問題。

本逐步解說假設您已完成逐步解說:建立 RIA Services 方案,並從這裡所述之程序建立的應用程式繼續。

若要顯示和編輯網域服務的資料

  1. 開啟逐步解說:建立 RIA Services 方案的 RIAServicesExample 方案。

  2. 在 MainPage.xaml 中變更介面,讓使用者儲存或拒絕 DataGrid 中的變更。

    下列 XAML 會加入 [Save Changes] 按鈕、[Reject Changes] 按鈕和文字區塊。

    <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 的程式碼後置頁面中加入按鈕 Click 事件的事件處理常式、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 的中繼資料類別。

    如需詳細資訊,請參閱 HOW TO:加入中繼資料類別

  2. 在中繼資料類別中,將 AllowEdit 屬性 (Property) 設為 falseEditableAttribute 屬性 (Attribute) 加入至 CustomerIDModifiedDate 屬性 (Property)。

    您可以將 EditableAttribute 屬性 (Attribute) 套用至一個屬性 (Property),以指出這個屬性 (Property) 是否可讓使用者在用戶端應用程式中進行編輯。將 AllowEdit 屬性設為 false 表示這個屬性在用戶端應用程式中是唯讀的。在這個範例中,您會顯示 CustomerIDModifiedDate 屬性的值,但不想讓使用者修改這些值。

  3. ExcludeAttribute 屬性 (Attribute) 加入至 rowguid 屬性 (Property)。

    您要將 ExcludeAttribute 屬性 (Attribute) 加入至您不想包含在用戶端專案之產生的程式碼中的屬性 (Property)。在這個範例中,不必在用戶端專案中公開 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. 為命名空間 (例如 System.ComponentModel.DataAnnotationsSystem.ServiceModel.DomainServices.Server) 加入必要的 usingImports 陳述式。

  5. 執行 (F5) 應用程式。

    請注意,您可以在 DataGrid 中編輯值。結束編輯的資料列時,ChangeText 值會更新成暫止的變更的描述。按一下 [Save Changes] 按鈕時,資料變更會儲存在資料庫中。按一下 [Reject Changes] 按鈕時,會還原所有暫止的變更。