Los hijos de mis hijos

Retornarle a un cliente WCF RIA Silverlight una entidad junto con sus entidades hijas es menos transparente de lo esperado, pero indudablemente sencillo.

Una de las maravillas de trabajar con una aplicación WCF RIA es que se trabaja con colecciones de objetos. Si en una base de datos tenemos una tabla de padres y otra de hijos, RIA (junto con el Entity Data Framework, por supuesto) nos presenta los padres como una colección de objetos y los hijos son a su vez una colección dentro de cada padre. Ya no necesitamos las maromas aquellas, de cuando usábamos DataSets, para relacionar padres con hijos. Pero todo tiene un pero, como para el caso de este modelo:

Modelo

Ya hemos notado que cuando se retornan una o varias entidades padres hacia un cliente Silverlight las entidades no incluyen los hijos (o entidades relacionadas). Desconcertante al principio porque a nivel del servicio WCF podemos notar que el modelo si las retornó pero no hicieron parte de la transmisión. Por ejemplo, aquí estoy tratando de observar lo que recibió Silverlight al pedir un Abuelo en nuestro modelo:

Cargue 1

Como pueden ver la colección de padres para un abuelo que solicité vino sin entidades, aunque créanme que si los tiene en la base de datos. La solución para esto es muy sencilla y requiere un par de pasos, los dos obligatorios, si queremos retornar "Abuelos" junto con sus "Padres":

1. Hay que indicarle a la consulta LINQ en el servicio que debe incluir los objetos relacionados, "Padres" en este caso:

  1. public IQueryable<Abuelo> GetAbuelos()
  2. {
  3.   return
  4.    this.ObjectContext.Abuelos.Include("Padres");
  5. }

2. En la metadata del servicio la entidad "Abuelo" debe tener el atributo "Include" en su colección de "Padres".

  1. internal sealed class AbueloMetadata
  2. {
  3.     private AbueloMetadata()
  4.     { }
  5.     public int Id { get; set; }
  6.     public string Nombre { get; set; }
  7.  
  8.     [Include]
  9.     public EntityCollection<Padre> Padres
  10.      { get; set; }
  11. }

Ya con esto, y revisando nuevamente nuestro punto de interrupción, vemos que ahora si nos llega la colección de "Padres" para cada "Abuelo":

Cargue 2

¿Y los hijos del padre? Efectivamente no le llegaron al cliente Silverlight pero la solución es similar:

1. Hay que indicarle a la consulta en el servidor que debe incluir los objetos relacionados, "Padres" y sus "Hijos", en este caso:

  1. public IQueryable<Abuelo> GetAbuelos()
  2. {
  3.     return
  4.     this.ObjectContext.Abuelos.Include
  5.     ("Padres.Hijos");
  6. }

2. En la metadata del servicio la entidad "Padres" debe tener el atributo "Include" en su colección de "Hijos".

  1. internal sealed class PadreMetadata
  2. {
  3.     private PadreMetadata() {  }
  4.     public Abuelo Abuelo { get; set; }
  5.     public int AbueloId { get; set; }
  6.     public EntityCollection<Auto> Autos
  7.       { get; set; }
  8.     [Include]
  9.     public EntityCollection<Hijo> Hijos
  10.      { get; set; }
  11.     public int Id { get; set; }
  12.     public string Nombre { get; set; }
  13. }

Y ahora la pregunta del millón: Si quiero los "Hijos" y los "Autos" del padre ¿Cómo se escribe? Ligeramente diferente:

1. En este caso requerimos una ramificación en el grafo de las entidades (en español: vamos a solicitar para una entidad varias de sus colecciones) de modo hay que indicarle a la consulta en el servidor que debe incluir los objetos relacionados, "Padres" e "Hijos" y a su vez "Padres" y sus "Autos":

  1. public IQueryable<Abuelo> GetAbuelos()
  2. {
  3.     return this.ObjectContext.Abuelos.Include("Padres.Hijos").Include("Padres.Autos");
  4. }

3. En la metadata del servicio la entidad "Padres" debe tener el atributo "Include" en su colección de "Autos".

Y con ello resolvemos el misterio ¿Sencillo? Indudablemente.

Anuncios

Acerca de SilverIdeas

Instructor y entusiasta en el uso de Silverlight y otras tecnologías XAML.
Esta entrada fue publicada en RIA, Silverlight. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s