연습: 도메인 서비스에서 데이터 편집
이 연습에서는 사용자가 표시된 데이터를 변경하고 데이터베이스에 해당 변경 내용을 저장할 수 있도록 하는 인터페이스를 만드는 방법을 배웁니다.
도메인 서비스에서 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 솔루션 만들기를 완료했다고 가정하며 해당 연습에서 설명한 절차로 만든 응용 프로그램을 바탕으로 합니다.
도메인 서비스의 데이터를 표시하고 편집하려면
연습: RIA Services 솔루션 만들기의 RIAServicesExample 솔루션을 엽니다.
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>
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라는 메타데이터 클래스를 엽니다.
자세한 내용은 방법: 메타데이터 클래스 추가를 참조하십시오.
메타데이터 클래스에서 AllowEdit 속성이 false로 설정된 EditableAttribute 특성을
CustomerID
및ModifiedDate
속성에 추가합니다.속성에 EditableAttribute 특성을 추가하여 사용자가 클라이언트 응용 프로그램에서 해당 속성을 편집할 수 있는지 여부를 나타냅니다. AllowEdit 속성을 false로 설정하면 클라이언트 응용 프로그램에서 속성이 읽기 전용입니다. 이 예제에서는
CustomerID
및ModifiedDate
속성에 대한 값을 표시하지만 사용자가 이들 값을 수정하지 못하게 합니다.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; } }
System.ComponentModel.DataAnnotations 및 System.ServiceModel.DomainServices.Server 등의 네임스페이스에 대해 필요한 using 또는 Imports 문을 추가합니다.
F5 키를 눌러 응용 프로그램을 실행합니다.
DataGrid에서 값을 편집할 수 있음을 확인합니다. 편집한 행에서 밖으로 나갈 때
ChangeText
값이 보류 중인 변경 내용에 대한 설명으로 업데이트됩니다. Save Changes 단추를 클릭하면 데이터 변경 내용이 데이터베이스에 저장되고, Reject Changes 단추를 클릭하면 보류 중인 변경 내용이 모두 되돌려집니다.