共用方式為


HOW TO:加入中繼資料類別

本主題將說明如何以您想要影響實體行為的屬性 (Attribute) 裝飾中繼資料類別中的屬性 (Property),藉此使用中繼資料將功能加入伺服器端和用戶端實體中。WCF RIA Services 支援為實體類別和屬性 (Property) 加上附註的功能。附註是利用部分類別 (稱為中繼資料類別) 實作的。中繼資料類別的使用時機是在想要為產生的實體類別加上附註,但不想在重新產生實體類別時遺失這些附註的時候使用。這可讓您加入驗證和子實體組合這類功能。您可以使用 MetadataTypeAttribute 屬性指定中繼資料類別。

加入中繼資料類別的方式有兩種。使用 [加入新的 DomainService 類別] 精靈加入新的 DomainService 類別時,您可以選取 [為中繼資料產生關聯的類別] 來指定自動產生中繼資料類別。您也可以手動加入中繼資料類別。本主題將說明這兩種加入中繼資料類別的方式。

若要使用 DomainService 類別範本加入中繼資料類別

  1. 在伺服器專案中加入新項目,然後選取 [DomainService 類別] 範本。

  2. [加入新的 DomainService 類別] 對話方塊出現時選取要在網域服務中公開的實體。

  3. 選取 [為中繼資料產生關聯的類別] 核取方塊。

    RIA_ServicesMetadataClass

  4. 按一下 [確定]。

    隨即產生 DomainService 類別的檔案和中繼資料類別的檔案。中繼資料類別的名稱中包含 .metadata (例如 DomainService1.metadata.csDomainService1.metadata.vb)。

  5. 開啟中繼資料類別,並將屬性 (Attribute) 加入至屬性 (Property)。

    下列範例會顯示 RoundtripOriginalAttributeRequiredAttributeStringLengthAttributeExcludeAttribute 套用至某些屬性的中繼資料類別。

    <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; }
        }
    }
    

若要手動加入中繼資料類別

  1. 在伺服器專案中加入新的類別檔,並讓它與要加上附註的實體類別同名。依照慣例,在檔名中包含 .metadata

  2. 加入 partial 關鍵字,使這個類別變成部分類別。

    下列範例將示範與名為 Address 之實體類別相符的部分類別。

    Partial Public Class Address
    End Class
    
    public partial class Address
    {
    }
    
  3. 在部分類別中,建立一個將做為中繼資料類別的內部類別。

    下列範例將示範內部中繼資料類別。

    Partial Public Class Address
      Friend NotInheritable Class AddressMetadata
      End Class
    End Class
    
    public partial class Address
    {
      internal sealed class AddressMetadata
      {
      }
    }
    
  4. 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
      {
      }
    }
    
  5. 在中繼資料類別中加入與實體類別屬性同名的屬性。

  6. 將屬性 (Attribute) 加入至屬性 (Property)。

    下列範例會顯示 RoundtripOriginalAttributeRequiredAttributeStringLengthAttributeExcludeAttribute 套用至某些屬性的中繼資料類別。

    <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; }
        }
    }