Condividi tramite


Procedura: aggiungere classi di metadati

In questo argomento viene illustrato come utilizzare i metadati per aggiungere funzionalità alle entità server e client mediante la decorazione delle proprietà in una classe di metadati con gli attributi da applicare al comportamento delle entità. WCF RIA Services supporta la possibilità di annotare classi e proprietà di entità. Le annotazioni vengono implementate con le classi parziali chiamate classi di metadati. Le classi di metadati si utilizzano per annotare le classi di entità generate senza che le annotazioni vengano perse quando la classe di entità viene rigenerata. In tal modo è possibile aggiungere funzionalità quali la convalida e la composizione di entità figlio. Per specificare la classe di metadati, è possibile utilizzare l'attributo MetadataTypeAttribute.

Sono disponibili due modalità per aggiungere le classi di metadati. Quando si aggiunge una nuova classe DomainService con la procedura guidata Aggiungi una nuova classe DomainService, è possibile specificare che una classe di metadati venga generata automaticamente selezionando Genera classi associate per i metadati. È possibile anche aggiungere una classe di metadati manualmente. In questo argomento vengono descritte queste due modalità per aggiungere classi di metadati.

Per aggiungere una classe di metadati tramite il modello Classe di DomainService

  1. Aggiungere un nuovo elemento al progetto server e selezionare il modello Classe di DomainService.

  2. Quando viene visualizzata la finestra di dialogo Aggiungi una nuova classe DomainService, selezionare le entità da esporre nel servizio del dominio.

  3. Selezionare la casella di controllo Genera classi associate per i metadati.

    RIA_ServicesMetadataClass

  4. Fare clic su OK.

    Viene generata una classe per il servizio del dominio e un file per la classe di metadati generata. La classe di metadati contiene .metadata nel nome (ad esempio, DomainService1.metadata.cs o DomainService1.metadata.vb).

  5. Aprire la classe di metadati e aggiungere gli attributi alle proprietà.

    Nell'esempio seguente viene illustrata una classe di metadati con RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute e ExcludeAttribute applicati ad alcune proprietà.

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

Per aggiungere una classe di metadati manualmente

  1. Nel progetto server, aggiungere un nuovo file di classe con lo stesso nome della classe di entità che si desidera annotare. Per convenzione, includere .metadata nel nome file.

  2. Aggiungere la parola chiave partial per rendere parziale la classe.

    Nell'esempio seguente viene illustrata una classe parziale che corrisponde a una classe di entità denominata Address.

    Partial Public Class Address
    End Class
    
    public partial class Address
    {
    }
    
  3. Nella classe parziale creare una classe interna che servirà da classe di metadati.

    Nell'esempio riportato di seguito viene illustrata la classe di metadati interna.

    Partial Public Class Address
      Friend NotInheritable Class AddressMetadata
      End Class
    End Class
    
    public partial class Address
    {
      internal sealed class AddressMetadata
      {
      }
    }
    
  4. Aggiungere un attributo MetadataTypeAttribute alla classe parziale e includere il tipo della classe di metadati.

    Nell'esempio riportato di seguito viene illustrata l'applicazione dell'attributo MetadataTypeAttribute alla 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. Nella classe di metadati, aggiungere le proprietà che hanno lo stesso nome delle proprietà nella classe di entità.

  6. Aggiungere gli attributi alle proprietà.

    Nell'esempio seguente viene illustrata una classe di metadati con RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute e ExcludeAttribute applicati ad alcune proprietà.

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