HOW TO:加入中繼資料類別
本主題將說明如何以您想要影響實體行為的屬性 (Attribute) 裝飾中繼資料類別中的屬性 (Property),藉此使用中繼資料將功能加入伺服器端和用戶端實體中。WCF RIA Services 支援為實體類別和屬性 (Property) 加上附註的功能。附註是利用部分類別 (稱為中繼資料類別) 實作的。中繼資料類別的使用時機是在想要為產生的實體類別加上附註,但不想在重新產生實體類別時遺失這些附註的時候使用。這可讓您加入驗證和子實體組合這類功能。您可以使用 MetadataTypeAttribute 屬性指定中繼資料類別。
加入中繼資料類別的方式有兩種。使用 [加入新的 DomainService 類別] 精靈加入新的 DomainService 類別時,您可以選取 [為中繼資料產生關聯的類別] 來指定自動產生中繼資料類別。您也可以手動加入中繼資料類別。本主題將說明這兩種加入中繼資料類別的方式。
若要使用 DomainService 類別範本加入中繼資料類別
在伺服器專案中加入新項目,然後選取 [DomainService 類別] 範本。
[加入新的 DomainService 類別] 對話方塊出現時選取要在網域服務中公開的實體。
選取 [為中繼資料產生關聯的類別] 核取方塊。
按一下 [確定]。
隨即產生 DomainService 類別的檔案和中繼資料類別的檔案。中繼資料類別的名稱中包含
.metadata
(例如DomainService1.metadata.cs
或DomainService1.metadata.vb
)。開啟中繼資料類別,並將屬性 (Attribute) 加入至屬性 (Property)。
下列範例會顯示 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 { } }
在中繼資料類別中加入與實體類別屬性同名的屬性。
將屬性 (Attribute) 加入至屬性 (Property)。
下列範例會顯示 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; } } }