[email protected]

Asunción, PARAGUAY

Ingeniería y desarrollo de software, emprendimiento, cursos

30 de marzo de 2014

Silverlight: Propiedades de metadatos personalizados para DomainService

Silverlight

Introducción

Esta entrada simplemente demuestra cómo agregar una propiedad personalizada en los metadatos generados por el  DomainService metadata.

Muchas veces, sobre todo cuando trabajamos con el ADO.NET Entity Framework, necesitamos agregar algunas propiedades adicionales en nuestro metadatos generados, por ejemplo, cuando debemos calcular algo o concatenar algunas cadenas de caracteres.

Primeros pasos

En este caso, debemos crear una aplicación de tipo 'Aplicación de negocios Silverlight'. Así que, utilizaremos el 'Proyecto Web ASP.NET', Luego de eso, necesitamos crear un archivo de base de datos con dos tablas (de manera a probar la teoría). Lo haríamos de la siguiente manera:



Es aquí, donde crearemos nuestro ADO.NET Entity Data Model,  la clase Domain Service y los metadatos para dicha clase. De esta manera, la  estructura de la 'Aplicación Web ASP.NET' quedará de la siguiente manera:
 

En la clase de servicio 'DomainService1.metadata.cs', deberíamos reemplazar la implementacion del método GetCities(). Entonces, agregamos estas líneas de código:
public IQueryable GetCities()

    return this.ObjectContext.Cities.Include("Country").OrderBy(c=>c.CityName); 


Muy bien, con estos pasos tendremos listo nuestro Domain Service listo.

Utilizando el código

Ahora, en nuestro proyecto Silverlight, expandimos Views/Home.xaml y lo abrimos. En el código XAML ingresamos las siguientes líneas:
<navigation:Page.Resources>
    <riacontrols:DomainDataSource x:Key="cityDDS" AutoLoad="True" QueryName="GetCities" >
        <riacontrols:DomainDataSource.DomainContext>
            <data:DomainService1 />
        </riacontrols:DomainDataSource.DomainContext>            
    </riacontrols:DomainDataSource>
</navigation:Page.Resources>
<sdk:DataGrid Grid.Row="0" 
AutoGenerateColumns="False" Margin="10" 
ItemsSource="{Binding Source={StaticResource cityDDS}, Path=Data}">
      <sdk:DataGrid.Columns>
          <sdk:DataGridTextColumn Header="CityID" 
          Binding="{Binding CityID}" />
          <sdk:DataGridTextColumn Header="City Name" 
          Binding="{Binding CityName}" />
          <sdk:DataGridTextColumn Header="Country Name" 
          Binding="{Binding Country.CountryName}" />
          <sdk:DataGridTextColumn Header="CountryID" 
          Binding="{Binding Country.CountryID}" />
      </sdk:DataGrid.Columns>
</sdk:DataGrid>

En el código ingresado arriba, agregamos un simple control de tipo 'DataGrid' mostrando datos simples que provienen del proyecto web, mediante WCF RIA Services.

Ahora agregaremos la extensión, que permitirá agregar las propiedades personalizadas a los metadatos generados anteriormente. Agregamos la clase DomainService1.metadata.partial.cs de la siguiente manera:
using System.Runtime.Serialization;

namespace MetadataExtension.Web
{
    public partial class City
    {
        [DataMember]
        public string CityData
        {
            get { return this.CityID.ToString() + " - " + this.CityName;}
        }
    }

    public partial class Country
    {
        [DataMember]
        public string CountryData
        {
            get { return this.CountryID.ToString() + " - " + this.CountryName;}
        }
    }
}

En el código anterior, seguramente has notado que agregamos la palabra clave partial a la clase. Con dicha palabra clave (en ambos archivos del DomainService.metadata) compartimos las propiedades existentes en la clase metadata que ha sido generada de forma automática por el ADO.NET Entity Framework

Necesitamos compilar nuestro proyecto web ASP.NET y no encontrarnos con ningún error. 

Volviendo al proyecto Silverlight, específicamente en el archivo Home.xaml,  agregamos las siguientes líneas de código:
<sdk:DataGrid Grid.Row="1" AutoGenerateColumns="False" 
Margin="10" ItemsSource="{Binding Source={StaticResource cityDDS}, Path=Data}">
     <sdk:DataGrid.Columns>
         <sdk:DataGridTextColumn Header="CityID" 
         Binding="{Binding CityData}" />
         <sdk:DataGridTextColumn Header="Country Name" 
         Binding="{Binding Country.CountryData}" />
     </sdk:DataGrid.Columns>
</sdk:DataGrid>
Luego de estos pasos, podemos Ejecutar el proyecto (F5) y veremos el resultado que buscamos.

Puntos de interés

Tenemos dos controles DataGrid en nuestra solución. El primero muestra los datos directamente desde los metadatos originales desde el DomainService, mientras que el otro, muestra los datos de las propiedades expuestas en los metadatos que extendimos.

Conclusión

En esta entrada he mostrado los pasos para crear propiedades personalizadas en los metadatos del ADO.NET Entity Framework que resultan muy útiles para la generación de clases y optimizar el código que necesitamos en nuestras aplicaciones Silverlight.

Hey, we've just launched a new custom color Blogger template. You'll like it - https://t.co/quGl87I2PZ
Suscribíte al boletín