11

ich den Fehler bekommen:Zyklen enthält, und kann nicht serialisiert werden, wenn Referenznachführmerkmal deaktiviert ist, json.net und WebAPI

Object graph for type 'System.Collections.Generic.List`1[[Proj.Model.Prom, Proj.Model, 
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' contains cycles and cannot be 
serialized if reference tracking is disabled. 

darüber Lesen, scheint der Serializer zu sein, aber Json.Net behauptet, Sei die Lösung und ich habe WebApi gelesen und Framework 4.5 hat es standardmäßig. Also kommt es standardmäßig? Wenn ja, warum bekomme ich diesen Fehler immer noch?

Danke! Guillermo.

EDIT: Hinzufügen von Code

using System; 
using System.Collections.Generic; 
using System.Data.Spatial; 

namespace Proj.Model 
{ 
    public class Prom 
    { 
     public Prom() 
     { 
      this.Stores = new List<Store>(); 
      this.Branches = new List<Branch>(); 
      this.Products = new List<Product>(); 
     } 

     public int Id { get; set; } 
     public string Name { get; set; } 
     public DbGeography Location { get; set; } 
     public string Latitude { get; set; } 
     public string Longitude { get; set; } 
     public int StateId { get; set; } 
     public int CategoryId { get; set; } 

     public virtual ICollection<Store> Stores { get; set; } 
     public virtual ICollection<Branch> Branches { get; set; } 
     public virtual ICollection<Product> Products { get; set; } 

     public virtual Category Category { get; set; } 
     public virtual State State { get; set; } 

    } 
} 

using System; 
using System.Collections.Generic; 

namespace Proj.Model 
{ 
    public class Category 
    { 
     public Category() 
     { 
      this.Proms = new List<Prom>(); 
     } 

     public int Id { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 

     public virtual ICollection<Prom> Proms { get; set; } 
    } 
} 

Dann etwas wie folgt ausgeführt liefert den Fehler

public IEnumerable<Category> GetList(int estadoId, string idTiposTarjetasList) 
{ 
    var ids = "1,2,3,4".Split(','); 
    var intIds = ids.Select(int.Parse); 

    var Categories = Uow.Categorias.GetAllIncluding(c => c.Proms).ToList(); 
    foreach (var category in Categories) 
    { 
     var proms = category.Proms.Where(p => intIds.Contains(p.Id) && p.StateId == stateId).ToList(); 
     category.Proms = proms; 
    } 
    return Categories 
} 
+0

sehen Sie das gleiche Problem, wenn Sie Proxies deaktivieren? (http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbcontextconfiguration.proxycreationenableed(v=VS.103).aspx) – Pawel

Antwort

8

standardmäßig eingestellt WebAPI die 'PreserveReferencesHandling' auf Keine.

Sie können die Json.NET SerializerSettings in WebApiConfig.cs konfigurieren:

config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.All; 
+1

Hinzugefügt, aber ich bekomme immer noch den gleichen Fehler – polonskyg

+0

Können Sie Ihre Proj.Model.Prom-Klasse freigeben? –

+0

Der Code zur ursprünglichen Frage hinzugefügt. – polonskyg

3

Die folgende mir geholfen:

config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;