Serializar un objeto de Entity Framework sin la Propiedad __type en JSON

Hola que tal! , en este post les mostrare una forma de serializar nuestro objeto que tengamos creado por medio de EntityFramework y este sea serializado en JSON sin el atributo __type, bueno cuando estamos trabajando con el framework ya mencionado, trabajamos directamente a nuestra aplicación vemos que no tenemos ningún problema, ahora si queremos que este objeto pueda se obtenido por medio de un WebServie y lo transformamos en JSON, pues notamos que tiene esa propiedad para especificar que podemos recuperar los tipos de objeto que se esta enviando, pero ahora no siempre se requiere que este se recupere en el objeto original , solo se desean utilizar los datos específicos en alguna APP que estemos desarrollando.

JSON (notación de objetos JavaScript) es un formato de codificación de datos eficaz que permite intercambios rápidos de cantidades pequeñas de datos entre los exploradores de cliente y servicios web con AJAX (JavaScript asincrónico y XML) habilitado.

 

Tenemos el siguiente WebMethod, en la cual devuelve una lista de proveedores desde la base de datos

	[WebMethod]
        public static List Proveedores()
        {
	    //creamos la instancia del Modelo de Entity
            PuntoDeVentaEntities pve = new PuntoDeVentaEntities();
	   //consultamos y devolvemos una lista de Proveedores desde la Base de Datos
            return pve.Proveedor.ToList(); 
        }

Si Probamos este Método y lo mandamos a llamar desde JQuery, tambien Puedes ver Mi otro Post donde hago la llamada de un WebMethod desde JQuery,

por lo que mostrare al respuesta HTTP

image

Se tiene el mensaje de error, dice: se detectó una referencia circular mientras serializar un objeto de tipo que estamos devolviendo en este caso es de Tipo Empleado, bueno para analizar esto vemos como esta construido nuestra Entidad Proveedor.

public partial class Proveedor
    {
        public Proveedor()
        {
            this.Compra = new HashSet();
            this.Producto = new HashSet();
        }
    
        public long IdProveedor { get; set; }
        public string Nombre { get; set; }
        public string Direccion { get; set; }
        public string Telefono { get; set; }
        public string Email { get; set; }
        public string Vendedor { get; set; }
        public string Imagen { get; set; }
        public bool Activo { get; set; }
    
        public virtual ICollection Compra { get; set; }
        public virtual ICollection Producto { get; set; }
    }

Como se puede notar se tiene dos Coleccione del uno del tipo Compra y el otro del tipo Producto. Bueno una de las Soluciones, es la instancia de nuestro Modelo

Establecer Configuration.ProxyCreationEnabled = false;

A veces es útil evitar que Entity Framework cree instancias de proxy. Por ejemplo, la serialización de instancias no proxy es mucho más fácil que serializar las instancias de proxy. La creación de proxy puede desactivarse quitando la marca ProxyCreationEnabled. Un lugar donde puede hacer esto es en el constructor del contexto.

Creación de un proxy (ProxyCreationEnabled). Esta propiedad, cuyo valor por defecto es “True”, va a permitir llevar a cabo el seguimiento de Cambios de estado de nuestras entidades, pero al deshabilitarlo esto ya no sucederá por lo cual podemos devolverlo a través de nuestro WebMethod.

Entonces quedaria de la siguiente Manera nuestro WebMethod.

 [WebMethod]
        public static List Proveedores()
        {
	    //creamos la instancia del Modelo de Entity
            PuntoDeVentaEntities pve = new PuntoDeVentaEntities();
            //se deshabilita la creacion del Proxy
            pve.Configuration.ProxyCreationEnabled = false;
	   //consultamos y devolvemos una lista de Proveedores desde la Base de Datos
            return pve.Proveedor.ToList(); 
        }

Ahora veremos una parte de la respuesta HTTP.

image 

Como se puede ver ahora si ya se transforma en nuestro Objeto Json, pero ahora quitaremos la Propiedad __Type, esto lo podemos hacer de la siguiente manera:

se usara JavaScriptSerializer

using System.Web.Script.Serialization; 

para poder transformar a JSON de la menera que se requiere para este ejemplo.

Nuestro WebMethod quedaria finalmente como sigue:

[WebMethod]
        public static string Proveedores()
        {
            //creamos la instancia
            PuntoDeVentaEntities pve = new PuntoDeVentaEntities();
            //deshabilitamos la creacion del Proxy
            pve.Configuration.ProxyCreationEnabled = false;
            //realizamos la consulta con LINQ to Entities
            var lst = pve.Proveedor.ToList();
            //creamos el Objeto para serializar
            JavaScriptSerializer serializer = new JavaScriptSerializer(null);
            //serializamos la lista de objetos devueltos de nuestra consulta realizada.
            string json = serializer.Serialize(lst);
            //devolvemos la cadena en formato JSON
            return json; 
        }

Ahora veremos el resultado correspondiente al cambio que se ha realizado en nuestro Método al llamarlo:

image

Espero que les haya sido de gran utilidad, en el desarrollo de sus aplicaciones. Saludos!.

Deja un comentario