方法: メタデータ クラスを追加する
ここでは、エンティティの動作に影響を与える属性によってメタデータ クラス内のプロパティを装飾することで、メタデータを使用してサーバーおよびクライアント側のエンティティに機能を追加する方法について説明します。WCF RIA サービス では、エンティティ クラスおよびプロパティに注釈を付ける機能がサポートされています。注釈は、メタデータ クラスと呼ばれる部分クラスで実装されます。生成されたエンティティ クラスに注釈を付け、エンティティ クラスを再生成してもその注釈が失われないようにする場合にメタデータ クラスを使用します。これにより、検証や子エンティティ コンポジションなどの機能を追加できます。メタデータ クラスを指定するには、MetadataTypeAttribute 属性を使用します。
メタデータ クラスを追加する方法は 2 とおりあります。新しいドメイン サービス クラスを追加ウィザードを使用して新しい DomainService クラスを追加する場合は、[メタデータ用の関連クラスを生成する] チェック ボックスをオンにすることで、メタデータ クラスが自動的に生成されるように指定できます。また、メタデータ クラスを手動で追加することもできます。ここでは、メタデータ クラスを追加するこの 2 つの方法について説明します。
DomainService クラス テンプレートを使用してメタデータ クラスを追加するには
サーバー プロジェクトで、新しい項目を追加し、[DomainService クラス] テンプレートをクリックします。
[新しいドメイン サービス クラスの追加] ダイアログ ボックスが表示されたら、ドメイン サービスで公開するエンティティを選択します。
[メタデータ用の関連クラスを生成する] チェック ボックスをオンにします。
[OK] をクリックします。
ドメイン サービス クラス用のファイルが生成され、メタデータ クラス用のファイルが生成されます。このメタデータ クラスの名前には、
.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 キーワードを追加して、このクラスを部分クラスにします。
Address
という名前のエンティティ クラスに一致する部分クラスを次の例に示します。Partial Public Class Address End Class
public partial class Address { }
部分クラスで、メタデータ クラスとして機能する内部クラスを作成します。
内部メタデータ クラスを次の例に示します。
Partial Public Class Address Friend NotInheritable Class AddressMetadata End Class End Class
public partial class Address { internal sealed class AddressMetadata { } }
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; } } }