Procédure : Ajouter des classes de métadonnées

Cette rubrique explique comment utiliser des métadonnées pour ajouter des fonctionnalités à vos entités côté client et serveur en décorant les propriétés d'une classe de métadonnées par des attributs qui permettent d'affecter le comportement de vos entités. Les Services RIA WCF prennent en charge la possibilité d'annoter des classes et des propriétés d'entité. Les annotations sont implémentées avec des classes partielles appelées des classes de métadonnées. Vous utilisez des classes de métadonnées lorsque vous voulez annoter les classes d'entité générées, mais ne pas perdre ces annotations lorsque la classe d'entité est régénérée. Cela vous permet d'ajouter une fonctionnalité telle que la validation et la composition d'entité enfant. Vous spécifiez une classe de métadonnées à l'aide de l'attribut MetadataTypeAttribute.

Il existe deux manières d'ajouter des classes de métadonnées. Lorsque vous ajoutez une nouvelle classe DomainService à l'aide de l'Assistant Ajouter une nouvelle classe de service de domaine, vous pouvez spécifier la génération automatique d'une classe de métadonnées en activant la case à cocher Générer des classes associées pour les métadonnées. Vous pouvez aussi ajouter une classe de métadonnées manuellement. Cette rubrique décrit ces deux méthodes d'ajout de classes de métadonnées.

Pour ajouter une classe de métadonnées à l'aide du modèle Classe DomainService

  1. Dans le projet serveur, ajoutez un nouvel élément et sélectionnez le modèle Classe DomainService.

  2. Quand la boîte de dialogue Ajouter une nouvelle classe de service de domaine s'affiche, sélectionnez les entités à exposer dans le service de domaine.

  3. Activez la case à cocher Générer des classes associées pour les métadonnées.

    RIA_ServicesMetadataClass

  4. Cliquez sur OK.

    Un fichier est généré pour la classe DomainService, et un autre pour la classe de métadonnées. Le nom de la classe de métadonnées contient .metadata (par ex., DomainService1.metadata.cs ou DomainService1.metadata.vb).

  5. Ouvrez la classe de métadonnées et ajoutez des attributs aux propriétés.

    L'exemple suivant montre une classe de métadonnées avec RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute et ExcludeAttribute appliqués à certaines des propriétés.

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

Pour ajouter une classe de métadonnées manuellement

  1. Dans le projet serveur, ajoutez un nouveau fichier de classe portant le même nom que la classe d'entité que vous voulez annoter. Par convention, incluez .metadata dans son nom de fichier.

  2. Ajoutez le mot-clé partial pour rendre la classe partielle.

    L'exemple suivant montre une classe partielle qui correspond à une classe d'entité nommée Address.

    Partial Public Class Address
    End Class
    
    public partial class Address
    {
    }
    
  3. Dans la classe partielle, créez une classe interne qui servira de classe de métadonnées.

    L'exemple suivant montre la classe de métadonnées interne.

    Partial Public Class Address
      Friend NotInheritable Class AddressMetadata
      End Class
    End Class
    
    public partial class Address
    {
      internal sealed class AddressMetadata
      {
      }
    }
    
  4. Ajoutez un attribut MetadataTypeAttribute à la classe partielle et incluez le type de classe de métadonnées.

    L'exemple suivant montre l'attribut MetadataTypeAttribute appliqué à la classe.

    <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. Dans la classe de métadonnées, ajoutez des propriétés ayant le même nom que les propriétés de la classe d'entité.

  6. Ajoutez des attributs aux propriétés.

    L'exemple suivant montre une classe de métadonnées avec RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute et ExcludeAttribute appliqués à certaines des propriétés.

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