2012-04-06 19 views
7

Originalmente había hecho esta pregunta: How Do I Resolve "A specified Include path is not valid"? que fue respondida, y mi .Include() ahora está funcionando, sin embargo, cuando el serializador intenta trabajar es mágico, obtengo el siguiente error:Error al serializar los datos del Código EF Primero 5.0 en el Controlador WebAPI

You must write an attribute 'type'='object' after writing the attribute 
with local name '__type'. 

Esto es lo que estoy haciendo para devolver los datos:

var everything = dc.Categories 
      .Include(c => c.Products); 

Mis definiciones de clases son bastante sencillo:

public class Category 
{ 
    public int CategoryId { get; set; } 
    public string Title { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 
} 

public class Product 
{ 
    public int ProductId { get; set; } 
    public string Title { get; set; } 

    public virtual Category Category { get; set; } 
} 

public class ProductDataContext : DbContext 
{ 
    public DbSet<Category> Categories { get; set; } 
    public DbSet<Product> Products { get; set; } 
} 

También intenté eliminar 'virtual' pero luego obtuve referencias circulares. Intenté hacer que el setter en ICollection Products fuera privado (como se sugiere aquí: http://forums.asp.net/t/1773164.aspx/1), que obtiene el error para borrar, pero luego mis productos no son parte del JSON devuelto.

¿Qué debo hacer para que los datos se serialicen con las categorías y sus productos?

EDITAR Aquí fue el seguimiento de la pila que estaba recibiendo:

[SerializationException: Object graph for type &#39;System.Collections.Generic.List`1[[Test.Models.Product, Test.Models, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]&#39; contains cycles and cannot be serialized if reference tracking is disabled.] 
System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult result) +30206 
System.Web.Http.WebHost.HttpControllerHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +10 
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9478661 
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +178 
+0

¿Cuál es el seguimiento de la pila ? – SLaks

+0

Agregué el rastro de pila así como también la solución a continuación, desenterré un par de otras publicaciones y las uní. – MisterJames

+0

... y gracias de nuevo por su ayuda @SLaks. – MisterJames

Respuesta

13

Con el fin de solucionar este problema que necesitaba:

  1. Desactivar la carga diferida, y
  2. Uso del IgnoreDataMember de System.Runtime.Serialization como un atributo en la propiedad de navegación Category (la referencia en el Product clase).

Espero que esto ayude a alguien.

para moverse por los errores XML-ish que utilicé la ayuda de aquí: http://www.strathweb.com/2012/03/serializing-entity-framework-objects-to-json-in-asp-net-web-api/

Para evitar el problema con las referencias cíclicas, he utilizado esto como una guía: MVC 4, Upshot entities cyclic references

+0

¿También ha deshabilitado ProxyCreationEnabled? –

+1

¡Muchas gracias por su respuesta! Me salvó la vida :) –

+1

Me salvó la vida x2 –

Cuestiones relacionadas