방법: 메타데이터 클래스 추가
이 항목에서는 엔터티의 동작에 영향을 주게 하려는 특성으로 메타데이터 클래스의 속성을 데코레이팅하여 메타데이터로 서버 및 클라이언트 쪽 엔터티에 기능을 추가하는 방법에 대해 설명합니다. WCF RIA Services에서는 엔터티 클래스 및 속성에 주석을 다는 기능을 제공합니다. 주석은 메타데이터 클래스라는 partial 클래스로 구현됩니다. 생성된 엔터티 클래스에 주석을 달고 엔터티가 다시 생성될 때 해당 주석이 유지되게 하려면 메타데이터 클래스를 사용합니다. 이를 통해 유효성 검사와 자식 엔터티 컴퍼지션 등의 기능을 추가할 수 있습니다. MetadataTypeAttribute 특성을 사용하여 메타데이터 클래스를 지정합니다.
메타데이터 클래스를 추가할 수 있는 방법은 두 가지입니다. 새 도메인 서비스 클래스 추가 마법사로 새 DomainService 클래스를 추가할 때 메타데이터에 대한 연결된 클래스 생성을 선택하여 메타데이터 클래스가 자동으로 생성되도록 지정할 수 있습니다. 메타데이터 클래스를 수동으로 추가할 수도 있습니다. 이 항목에서는 메타데이터 클래스를 추가하는 이 두 가지 방법에 대해 설명합니다.
도메인 서비스 클래스 템플릿을 사용하여 메타데이터 클래스를 추가하려면
서버 프로젝트에서 새 항목을 추가하고 도메인 서비스 클래스 템플릿을 선택합니다.
새 도메인 서비스 클래스 추가 대화 상자가 나타나면 도메인 서비스에서 노출할 엔터티를 선택합니다.
메타데이터에 대한 연결된 클래스 생성 확인란을 선택합니다.
확인을 클릭합니다.
도메인 서비스 클래스에 대한 파일이 생성되고 메타데이터 클래스에 대한 파일이 생성됩니다. 메타데이터 클래스의 이름에는
.metadata
가 포함됩니다(예:DomainService1.metadata.cs
또는DomainService1.metadata.vb
).메타데이터 클래스를 열고 속성에 특성을 추가합니다.
다음 예제에서는 RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute 및 ExcludeAttribute가 일부 속성에 적용된 메타데이터 클래스를 보여 줍니다.
<MetadataTypeAttribute(GetType(Address.AddressMetadata))> _ Partial Public Class Address Friend NotInheritable Class AddressMetadata 'Metadata classes are not meant to be instantiated. Private Sub New() MyBase.New End Sub Public AddressID As Integer <Required()> _ <StringLength(60)> _ <RoundtripOriginal()> _ Public AddressLine1 As String <RoundtripOriginal()> _ Public AddressLine2 As String <Required()> _ <StringLength(30)> _ <RoundtripOriginal()> _ Public City As String <RoundtripOriginal()> _ Public CountryRegion As String Public CustomerAddresses As EntityCollection(Of CustomerAddress) <RoundtripOriginal()> _ Public ModifiedDate As DateTime <Required()> _ <RoundtripOriginal()> _ Public PostalCode As String <Exclude()> _ Public rowguid As Guid <RoundtripOriginal()> _ Public StateProvince As String End Class End Class
[MetadataTypeAttribute(typeof(Address.AddressMetadata))] public partial class Address { internal sealed class AddressMetadata { // Metadata classes are not meant to be instantiated. private AddressMetadata() { } public int AddressID { get; set; } [Required] [StringLength(60)] [RoundtripOriginal] public string AddressLine1 { get; set; } [RoundtripOriginal] public string AddressLine2 { get; set; } [Required] [StringLength(30)] [RoundtripOriginal] public string City { get; set; } [RoundtripOriginal] public string CountryRegion { get; set; } public EntityCollection<CustomerAddress> CustomerAddresses { get; set; } [RoundtripOriginal] public DateTime ModifiedDate { get; set; } [Required] [RoundtripOriginal] public string PostalCode { get; set; } [Exclude] public Guid rowguid { get; set; } [RoundtripOriginal] public string StateProvince { get; set; } } }
메타데이터 클래스를 수동으로 추가하려면
서버 프로젝트에서 주석을 달려는 엔터티 클래스와 같은 이름의 새 클래스 파일을 추가합니다. 규칙에 따라 파일 이름에
.metadata
를 포함합니다.partial 키워드를 추가하여 클래스를 partial 클래스로 만듭니다.
다음 예제에서는
Address
라는 엔터티 클래스와 일치하는 partial 클래스를 보여 줍니다.Partial Public Class Address End Class
public partial class Address { }
partial 클래스에서 메타데이터 클래스로 사용할 내부 클래스를 만듭니다.
다음 예제에서는 내부 메타데이터 클래스를 보여 줍니다.
Partial Public Class Address Friend NotInheritable Class AddressMetadata End Class End Class
public partial class Address { internal sealed class AddressMetadata { } }
partial 클래스에 MetadataTypeAttribute 특성을 추가하고 메타데이터 클래스의 형식을 포함합니다.
다음 예제에서는 클래스에 적용된 MetadataTypeAttribute 특성을 보여 줍니다.
<MetadataTypeAttribute(GetType(Address.AddressMetadata))> _ Partial Public Class Address Friend NotInheritable Class AddressMetadata End Class End Class
[MetadataTypeAttribute(typeof(Address.AddressMetadata))] public partial class Address { internal sealed class AddressMetadata { } }
메타데이터 클래스에서 엔터티 클래스의 속성과 같은 이름의 속성을 추가합니다.
속성에 특성을 추가합니다.
다음 예제에서는 RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute 및 ExcludeAttribute가 일부 속성에 적용된 메타데이터 클래스를 보여 줍니다.
<MetadataTypeAttribute(GetType(Address.AddressMetadata))> _ Partial Public Class Address Friend NotInheritable Class AddressMetadata 'Metadata classes are not meant to be instantiated. Private Sub New() MyBase.New End Sub Public AddressID As Integer <Required()> _ <StringLength(60)> _ <RoundtripOriginal()> _ Public AddressLine1 As String <RoundtripOriginal()> _ Public AddressLine2 As String <Required()> _ <StringLength(30)> _ <RoundtripOriginal()> _ Public City As String <RoundtripOriginal()> _ Public CountryRegion As String Public CustomerAddresses As EntityCollection(Of CustomerAddress) <RoundtripOriginal()> _ Public ModifiedDate As DateTime <Required()> _ <RoundtripOriginal()> _ Public PostalCode As String <Exclude()> _ Public rowguid As Guid <RoundtripOriginal()> _ Public StateProvince As String End Class End Class
[MetadataTypeAttribute(typeof(Address.AddressMetadata))] public partial class Address { internal sealed class AddressMetadata { // Metadata classes are not meant to be instantiated. private AddressMetadata() { } public int AddressID { get; set; } [Required] [StringLength(60)] [RoundtripOriginal] public string AddressLine1 { get; set; } [RoundtripOriginal] public string AddressLine2 { get; set; } [Required] [StringLength(30)] [RoundtripOriginal] public string City { get; set; } [RoundtripOriginal] public string CountryRegion { get; set; } public EntityCollection<CustomerAddress> CustomerAddresses { get; set; } [RoundtripOriginal] public DateTime ModifiedDate { get; set; } [Required] [RoundtripOriginal] public string PostalCode { get; set; } [Exclude] public Guid rowguid { get; set; } [RoundtripOriginal] public string StateProvince { get; set; } } }