次の方法で共有


チュートリアル: ドメイン サービスのデータの編集

このチュートリアルでは、表示されたデータをユーザーが変更してその変更をデータベースに保存できるようにするインターフェイスを作成する方法について説明します。

ドメイン サービスに Update、Insert、または Delete の各メソッドを追加すると、ユーザーがデータを変更できるインターフェイスを Silverlight クライアントに作成できます。変更はすべて EntityChangeSet オブジェクトで追跡され、SubmitChanges メソッドを呼び出したときにまとめて送信されます。

前提条件

このチュートリアル、および WCF RIA サービス のドキュメントで紹介されている他のチュートリアルでは、WCF RIA サービス および WCF RIA サービス Toolkit に加え、Visual Studio 2010 や Silverlight の開発者向けランタイムと SDK など、前提条件となっているいくつかのプログラムが適切にインストールおよび構成されている必要があります。また、SQL Server 2008 R2 Express with Advanced Services をインストールして構成し、AdventureWorks OLTP と LT データベースをインストールすることも必要です。

これらの各前提条件を満たしているかどうかを確認するための詳細な手順については、「WCF RIA Services の前提条件」ノード内のトピックを参照してください。このチュートリアルを進める前に、トピックに記載されている手順に従って、この RIA サービス チュートリアルを実行するときに発生する問題をできるだけ最小限に抑えるようにします。

このチュートリアルでは、「チュートリアル: 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 の分離コード ページで、ボタン クリック イベントのイベント ハンドラー、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. メタデータ クラスで、AllowEdit プロパティが false に設定された EditableAttribute 属性を CustomerID プロパティと ModifiedDate プロパティに追加します。

    EditableAttribute 属性をプロパティに適用して、そのプロパティがクライアント アプリケーションでユーザーの編集対象となっているかどうかを示します。AllowEdit プロパティを false に設定すると、このプロパティはクライアント アプリケーションで読み取り専用になります。この例では、CustomerID プロパティと ModifiedDate プロパティの値を表示しますが、ユーザーがこれらの値を変更できないようにします。

  3. rowguid プロパティに ExcludeAttribute 属性を追加します。

    クライアント プロジェクト用に生成されたコードに含めないプロパティに 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. System.ComponentModel.DataAnnotationsSystem.ServiceModel.DomainServices.Server などの名前空間に必要な using ステートメントまたは Imports ステートメントを追加します。

  5. アプリケーションを実行します (F5 キーを押します)。

    DataGrid の値を編集することができます。編集した行から出ると、ChangeText の値は保留中の変更が記述されて更新されます。[Save Changes] をクリックすると、データの変更がデータベースに保存されます。[Reject Changes] をクリックすると、保留中のすべての変更が元に戻ります。