Skip to content

Exponer Entidades de Entity Framework por WCF

by en 30 julio, 2012

Hola a todos,

En PricingUC estamos trabajando con Entity Framework (en adelante EF) para una nueva aplicación y deseamos exponer los objetos mapeados por un servicio WCF.

No entraré en discusiones si esto debe hacerse o no, ni tampoco respecto al performance. Solo indicaré como se puede lograr.

Herramientas:

Si volvemos a lo básico de WCF recordemos que las clases para ser expuestas por el servicio deben tener una serie de atributos [DataContract] y [DataMember]. Las clases y propiedades que tengan estos atributos podrán ser expuestas por un servicio WCF.

Entity no crea automáticamente clases que podamos modificar para añadirles estos atributos, es por eso que existen templates de generación de código que permiten manipular las clases de EF de manera más sencilla.

Para comenzar necesitamos instalar en nuestra solución EF 4.3.1, dado que el template que utilizaremos soporta esa versión. Microsoft por algún motivo que desconozco (a ver si alguien me puede decir por qué), está entregando EF a través de paquetes NuGet, lo que añade soporte para un proyecto determinado y no como un paquete de instalación a nivel de entorno.

Guía de instalación de NuGet
Guía de instalación de .NET Framework 4.3.1
Instalar el Template ADO.NET C# DbContext Generator With WCF Support

Listo, ahora está lo que necesitamos.

Una vez creado el modelo en EF debemos hacer lo siguiente:

1.- Agregar una nueva generación de código usando el Template que descargamos.

 

 

 

 

2.- Abrir el archivo Model1.tt (o el nombre que le hayamos puesto) y buscar la implementación del método void WriteProperty(string accessibility, string type, string name, string getterAccessibility, string setterAccessibility) y cambiarle las lineas resaltadas.

 

 

debe decir lo siguiente:

void WriteProperty(string accessibility, string type, string name, string getterAccessibility, string setterAccessibility)

{
 if(accessibility.Equals("public"))
 {
#> [DataMember]
<#+ }#>
 <#=accessibility#> <#=type#> <#=name#> { <#=getterAccessibility#>get; <#=setterAccessibility#>set; }
<#+
}

Revisar cualquier clase y ver qué ocurre:

 

 

 

 

 

 

Los objetos de entity tienen relaciones entre sí, por ejemplo este objeto está relacionado con otro llamado StoreNode. WCF se confunde con estas relaciones y debemos evitar que se expongan. Solo debemos exponer las propiedades públicas. SI deseamos exponer las relaciones se debe tener mucho cuidado con las relaciones recursivas y los bucles, ya que estos hacen que WCF no los comprenda y no pueda exponerlos.

 

Espero se entienda, si hay algo que falte o alguna duda, pregunten de inmediato, yo estoy constantemente revisando mi blog.

Enjoy!

Dejar un comentario

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

A %d blogueros les gusta esto: