Pregunta

Estoy teniendo problemas con una referencia circular cuando intento y serializar un objeto devuelto a través de EF4 CTP5. Im usar el primer enfoque de código y sencilla de poco para mi modelo.

He añadido [ScriptIgnore] atribuye a las propiedades que proporcionan una referencia de nuevo a un objeto y fastidiosamente cada parece que funcionan bien si instanciar manualmente de la POCO, es decir, que serializan a JSON bien, y el atributo scriptignore se reconoce. Sin embargo cuando intento y serializar un objeto de regresar de la DAL consigo el excepción de referencia circular "Se detectó una referencia circular mientras que la serialización de un objeto de tipo 'System.Data.Entity.DynamicProxies.xxxx'"

He intentado varias formas de retreiving los datos, pero todos ellos se queden con este error:

    public JsonResult GetTimeSlot(int id) {
        TimeSlotDao tsDao = new TimeSlotDao();
        TimeSlot ts = tsDao.GetById(id);
        return Json(ts);
    }

El siguiente método funciona ligeramente mejor que en lugar de los objetos proxy intervalo de tiempo dinámico causando la refference circular el objeto de su cita.

    public JsonResult GetTimeSlot(int id) {
        TimeSlotDao tsDao = new TimeSlotDao();
            var ts = from t in tsDao.GetQueryable()
                 where t.Id == id
                 select new {t.Id, t.StartTime, t.Available, t.Appointment};
        return Json(ts);
    }

Todas las ideas o soluciones a este problema?

Actualizar Yo preferiría usar la de la caja serializador si es posible, aunque Json.Net través Nuget está bien como alternativa espero su posible utilizarlo como era mi intención, así ...

¿Fue útil?

Solución

He tenido un problema similar con un IIS alojado servicio WCF y tratando de serializar objetos POCO con la clase DataContractJsonSerializer. El construido en JSON serializador no parece para manejar las referencias circulares en absoluto. Yo era capaz de conseguir alrededor de él por el manejo de la serialización a mí mismo usando las Json.NET serializador, y simplemente devolver cadenas JSON de mis métodos. El serializador JSON.net tiene una opción para ignorar las referencias circulares como JSON en sí no los admite.

Otros consejos

No importa lo que hice la dinámica proxies mantienen siendo un punto de fricción, que fue tan lejos como la eliminación de todas las referencias circulares en mi modelo! pero aún así el problema persiste.

Me trató Json.Net pero se ha producido el mismo problema.

Al final, se topó con un post sobre el uso de una costumbre JavaScriptConverter

http: / /hellowebapps.com/2010-09-26/producing-json-from-entity-framework-4-0-generated-classes/

implementado el código y bobs su tío todo funcionó

He resuelto esto sin tener que recurrir a un serializador JSON externa. En una ProxyCreation discapacitados nutshull que en el constructor de mi contexto del objeto.

No estoy seguro de por qué esto funciona, pero me pusieron un seguimiento pregunta aquí.

Me utilizó la siguiente ContractResolver. Tenga en cuenta que he heredado de la CamelCaseContractPropertyResolver para obtener esa característica, así, pero también se puede heredar directamente de DefaultContractResolver.

using System;
using System.Collections.Generic;
using System.Reflection;
using Newtonsoft.Json.Serialization;

namespace MyNamespace
{
    /// <summary>
    /// This class enables EntityFramework POCO objects to be serialized. In some cases POCO
    /// objects are subclassed by a proxy which has an additional member _entityWrapper. This
    /// object prevents serialization (circular references and references to non-serializable types).
    /// This removes the _entityWrapper from the list of members to be serialized.
    /// </summary>
    public class ContractResolver : CamelCasePropertyNamesContractResolver
    {
        protected override List<MemberInfo> GetSerializableMembers(Type objectType)
        {
            if (objectType.FullName.StartsWith("System.Data.Entity.DynamicProxies."))
            {
                var members = base.GetSerializableMembers(objectType);
                members.RemoveAll(memberInfo => memberInfo.Name == "_entityWrapper");
                return members;
            }
            return base.GetSerializableMembers(objectType);
        }
    }
}

Para usarlo, crear su serializador y luego establecer la propiedad ContractResolver a una nueva instancia de esta clase:

var ser = JsonSerializer.Create(sJsonSerializerSettings);            
ser.ContractResolver = new ContractResolver(); 

he conocido a este problema también. Las respuestas a este tema se incluyen soluciones numéricas. Pero mejores soluciones diferentes para diferentes casos con la explicación y, además, sin encargo Serializa he encontrado en el artículo de Hongye Sun - manejo de bucle de referencia en API web .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top