연습: 도메인 서비스에서 데이터 편집

WCF RIA Services

이 연습에서는 사용자가 표시된 데이터를 변경하고 데이터베이스에 해당 변경 내용을 저장할 수 있도록 하는 인터페이스를 만드는 방법을 배웁니다.

도메인 서비스에서 update, insert 또는 delete 메서드를 추가한 경우 Silverlight 인터페이스에 사용자가 데이터를 변경할 수 있도록 하는 인터페이스를 만들 수 있습니다. 모든 변경 내용은 EntityChangeSet 개체에서 추적되며, SubmitChanges 메서드를 호출할 때 변경 내용이 일괄적으로 전송되지 않습니다.

WCF RIA Services 설명서에서 제공하는 이 연습 및 다른 연습을 실행하려면 WCF RIA Services 및 WCF RIA Services 도구 키트 외에도 Visual Studio 2010, Silverlight Developer 런타임 및 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의 코드 숨김 페이지에서 단추 클릭 이벤트에 대한 이벤트 처리기, 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 특성을 CustomerIDModifiedDate 속성에 추가합니다.

    속성에 EditableAttribute 특성을 추가하여 사용자가 클라이언트 응용 프로그램에서 해당 속성을 편집할 수 있는지 여부를 나타냅니다. AllowEdit 속성을 false로 설정하면 클라이언트 응용 프로그램에서 속성이 읽기 전용입니다. 이 예제에서는 CustomerIDModifiedDate 속성에 대한 값을 표시하지만 사용자가 이들 값을 수정하지 못하게 합니다.

  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 단추를 클릭하면 보류 중인 변경 내용이 모두 되돌려집니다.

표시: