tutorial net mvc framework first espaƱol code asp entity-framework entity-framework-4 asp.net-web-api

entity-framework - net - web api entity framework



Error de Asp.Net Web API: el tipo ''ObjectContent`1'' no pudo serializar el cuerpo de la respuesta para el tipo de contenido ''application/xml; charset=utf-8 '' (6)

Acabo de deshabilitar las clases de proxy según la necesidad:

// GET: ALL Employee public IEnumerable<DimEmployee> Get() { using (AdventureWorks_MBDEV_DW2008Entities entities = new AdventureWorks_MBDEV_DW2008Entities()) { entities.Configuration.ProxyCreationEnabled = false; return entities.DimEmployees.ToList(); } }

El ejemplo más simple de esto, obtengo una colección y trato de generarla a través de la API web:

// GET api/items public IEnumerable<Item> Get() { return MyContext.Items.ToList(); }

Y obtengo el error:

Objeto del tipo
''System.Data.Objects.ObjectQuery`1 [Dcip.Ams.BO.EquipmentWarranty]'' no puede convertirse en tipo
''System.Data.Entity.DbSet`1 [Dcip.Ams.BO.EquipmentWarranty]''

Este es un error bastante común que hacer con los nuevos proxies, y sé que puedo solucionarlo estableciendo:

MyContext.Configuration.ProxyCreationEnabled = false;

Pero eso frustra el propósito de mucho de lo que estoy tratando de hacer. ¿Hay una mejor manera?


En mi caso, el objeto devuelto tenía una propiedad dentro de él con un tipo que no tenía un constructor sin argumentos / predeterminado. Al agregar un constructor de argumento cero a ese tipo, el objeto se puede serializar con éxito.


Esto me ayudó:
Agregue el siguiente código en la función Application_Start de Global.asax.cs

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; GlobalConfiguration.Configuration.Formatters .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);


Si tiene propiedades de navegación, hágalos no virtuales. El mapeo seguirá funcionando, pero evita la creación de entidades Dynamic Proxy que no se pueden serializar.]

No tener carga diferida está bien en un WebApi ya que no tiene una conexión persistente y ejecutó un .ToList () de todos modos.


Sugeriría Deshabilitar la creación de proxy solo en el lugar donde no lo necesite o le esté causando problemas. No tiene que deshabilitarlo globalmente, solo puede deshabilitar el contexto actual de la base de datos a través del código ...

[HttpGet] [WithDbContextApi] public HttpResponseMessage Get(int take = 10, int skip = 0) { CurrentDbContext.Configuration.ProxyCreationEnabled = false; var lista = CurrentDbContext.PaymentTypes .OrderByDescending(x => x.Id) .Skip(skip) .Take(take) .ToList(); var count = CurrentDbContext.PaymentTypes.Count(); return Request.CreateResponse(HttpStatusCode.OK, new { PaymentTypes = lista, TotalCount = count }); }

Aquí solo deshabilité ProxyCreation en este método, porque para cada solicitud hay un nuevo DBContext creado y, por lo tanto, solo deshabilité ProxyCreation para este caso. Espero eso ayude


si tiene propiedades de navegación y no desea que sean virtuales, debe usar JSON.NET y cambiar la configuración en App_Start a usar JSON, no XML.
después de instalar JSON.NET desde NuGet, inserte este código en WebApiConfig.cs en el método Register

var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter);