Agregar clases de metadatos
En este tema se explica cómo utilizar los metadatos para agregar funcionalidad a las entidades del lado cliente y del lado servidor mediante la inclusión de propiedades en una clase de metadatos con los atributos que desea que afecten al comportamiento de las entidades. WCF RIA Services admite la capacidad de anotar clases y propiedades de entidad. Las anotaciones se implementan con clases parciales denominadas clases de metadatos. Utilice clases de metadatos cuando desee anotar las clases de entidad generadas, pero no desee perder esas anotaciones cuando se vuelva a generar la clase de entidad. Esto le permitirá agregar funcionalidad como la validación y la composición de entidades secundarias. Especifique una clase de metadatos utilizando el atributo MetadataTypeAttribute.
Hay dos formas de agregar clases de metadatos. Cuando agregue una nueva clase DomainService con el asistente Agregar nueva clase de servicio de dominio, podrá especificar que una clase de metadatos se genere automáticamente activando Generar clases asociadas para metadatos. También puede agregar una clase de metadatos manualmente. En este tema se describen estas dos maneras de agregar clases de metadatos.
Para agregar una clase de metadatos utilizando la plantilla Clase de servicio de dominio
En el proyecto de servidor, agregue un nuevo elemento y seleccione la plantilla Clase de servicio de dominio.
Cuando se muestre el cuadro de diálogo Agregar nueva clase de servicio de dominio, seleccione las entidades que desea que se expongan en el servicio de dominio.
Active la casilla Generar clases asociadas para metadatos.
Haga clic en Aceptar.
Se generará un archivo para la clase de servicio de dominio y un archivo para la clase de metadatos. La clase de metadatos contiene
.metadata
en su nombre (comoDomainService1.metadata.cs
oDomainService1.metadata.vb
).Abra la clase de metadatos y agregue atributos a las propiedades.
En el ejemplo siguiente se muestra una clase de metadatos con los atributos RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute y ExcludeAttribute aplicados a algunas propiedades.
<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; } } }
Para agregar una clase de metadatos manualmente
En el proyecto de servidor, agregue un nuevo archivo de clase con el mismo nombre que la clase de entidad que desea anotar. Por convención, incluya
.metadata
en su nombre de archivo.Agregue la palabra clave partial para convertir la clase en una clase parcial.
En el siguiente ejemplo se muestra una clase parcial que coincide con una clase de entidad denominada
Address
.Partial Public Class Address End Class
public partial class Address { }
En la clase parcial, cree una clase interna que actuará como clase de metadatos.
En el siguiente ejemplo se muestra la clase de metadatos interna.
Partial Public Class Address Friend NotInheritable Class AddressMetadata End Class End Class
public partial class Address { internal sealed class AddressMetadata { } }
Agregue un atributo MetadataTypeAttribute a la clase parcial e incluya el tipo de la clase de metadatos.
En el siguiente ejemplo se muestra el atributo MetadataTypeAttribute aplicado a la clase.
<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 { } }
En la clase de metadatos, agregue propiedades que tengan el mismo nombre que las propiedades de la clase de entidad.
Agregue atributos a las propiedades.
En el ejemplo siguiente se muestra una clase de metadatos con los atributos RoundtripOriginalAttribute, RequiredAttribute, StringLengthAttribute y ExcludeAttribute aplicados a algunas propiedades.
<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; } } }