Exceção de “Auto Referencing Loop Detected” com JSON.Net

Eu tenho esse bit de código para enviar uma lista de objects de Route para o meu modo de exibição (asp.net MVC):

 public ActionResult getRouteFromPart(int partId) { List routes = _routeService.GetRouteByPartType(partId); if (routes == null) { return this.AdvancedJsonResult(null, JsonRequestBehavior.AllowGet); } return this.AdvancedJsonResult(new { Routes = routes }, JsonRequestBehavior.AllowGet); } 

Mas estou recebendo uma exceção aqui na minha class AdvancedJsonResult :

 if (Data != null) { var settings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; string result = JsonConvert.SerializeObject(this.Data, this.Formatting, settings); response.Write(result); } 

Eu tentei o truque “ReferenceLoopHanding.Ignore” que silencia a exceção, mas a lista ainda não é passada para a exibição.

O código funciona quando eu mudo routes para um único object em vez de uma lista, então acho que o código simplesmente não gosta de trabalhar com uma lista.

Eu sou novo neste projeto, então não sei como consertar isso e fazer com que seja feliz usar uma List …

Edit: Aqui está a mensagem de exceção completa, que acontece na linha string result = JsonConvert...

Loop de auto-referência detectado com o tipo ‘System.Data.Entity.DynamicProxies.PartNumber_B135A5D16403B760C3591872ED4C98A25643FD10B51246A690C2F2D977973452’. Caminho ‘routes [0] .incomingLots [0] .partNumber.partType.partNumbers’.

O significado da mensagem de erro é que existe um loop de auto-referência. Você precisa definir o contexto do database que não deseja obter todas as entidades vinculadas quando solicitar algumas entidades. Isso pode ser feito adicionando duas linhas no construtor da class DbContext para desabilitar o loop de auto-referência, conforme mostrado abaixo:

 public YourDbContext() : base("name = YourDbContext") { //add these lines in order to avoid from "Self referencing loop detected for ..." error this.Configuration.LazyLoadingEnabled = false; this.Configuration.ProxyCreationEnabled = false; } 

Espero que isto ajude…