2012-04-06 9 views
7

Pierwotnie zadałem to pytanie: How Do I Resolve "A specified Include path is not valid"?, na które odpowiedziano, a moja funkcja .Include() działa teraz, jednak gdy serialser spróbuje działać, to magia, dostaję następujący błąd:Błąd podczas serializacji kodu EF Pierwsze dane 5.0 w WebAPI Controller

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

Oto co robię, aby przywrócić dane:

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

moich definicji klasy są dość proste:

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; } 
} 

Próbowałem również usunąć "wirtualne", ale potem otrzymałem odwołania kołowe. Próbowałem ustawić setter na ICollection Products private (zgodnie z sugestią tutaj: http://forums.asp.net/t/1773164.aspx/1), który otrzymuje błąd do wyczyszczenia, ale wtedy moje produkty nie są częścią zwróconego JSON.

Co muszę zrobić, aby dane były przekształcane do postaci szeregowej z kategoriami i ich produktami?

EDIT Tu był ślad stosu ja trafiałem:

[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

Co to jest ślad stosu ? – SLaks

+0

Dodałem ślad stosu, a także rozwiązanie poniżej, wykopałem z kilku innych postów i zszytą razem. – MisterJames

+0

... i jeszcze raz dziękuję za pomoc @SLaks. – MisterJames

Odpowiedz

13

W celu ustalenia tego potrzebowałem:

  1. Wyłącz leniwy załadunku i
  2. Użyj IgnoreDataMember od System.Runtime.Serialization jako atrybutu w właściwości nawigacji Category (odwołanie zwrotne na Product klasa).

Mam nadzieję, że to komuś pomaga.

Aby obejść błędy XML-owski użyłem pomoc stąd: http://www.strathweb.com/2012/03/serializing-entity-framework-objects-to-json-in-asp-net-web-api/

Aby obejść problem z odniesieniami cyklicznych, użyłem tego jako przewodnika: MVC 4, Upshot entities cyclic references

+0

Czy wyłączyłeś również ProxyCreationEnabled? –

+1

Dziękuję bardzo za odpowiedź! Uratowało mi życie :) –

+1

Uratowałem moje życie x2 –