Frage

Ich habe Probleme mit einer kreisförmigen Referenz, wenn ich versuche und serialise ein Objekt über EF4 CTP5 zurückgegeben. Im mit dem Code ersten Ansatz und einfache POCO für mein Modell.

Ich habe hinzugefügt [ScriptIgnore] Attribute auf alle Eigenschaften, die einen Rückverweis auf ein Objekt zur Verfügung stellen und annoyingly jeder scheint zu funktionieren, wenn ich die POCO manuell instanziiert, das heißt, sie zu JSON feiner serialise und das scriptignore Attribut wird anerkannt. Allerdings, wenn ich versuche und serialise ein Objekt aus der DAL zurück bekomme ich die kreisförmige Referenz Ausnahme „Eine kreisförmige Referenz erkannt wurde, während ein Objekt vom Typ‚System.Data.Entity.DynamicProxies.xxxx‘Serialisierung“

Ich habe mehrere Möglichkeiten versucht, die Daten von retreiving aber sie alle stecken bleiben mit diesem Fehler:

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

In der unten stehenden Werken etwas besser als anstatt die Zeitschlitz dynamische Proxy-Objekt bewirkt, dass die kreisförmigen refference seiner Ernennung Objekt.

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

Irgendwelche Ideen oder Lösungen für dieses Problem?

Aktualisieren Ich würde das aus dem Kasten heraus Serializer, wenn möglich, obwohl Json.Net über nuget bevorzugen ist ok als Alternative würde ich hofft, dass ihre möglich, es zu benutzen, wie ich auch gedacht ...

War es hilfreich?

Lösung

Ich hatte ein ähnliches Problem mit einem IIS gehosteten WCF-Dienst und versuchen POCO zu serialisiert Objekte mit der DataContractJsonSerializer Klasse. Die in JSON Serializer gebaut scheint nicht zirkuläre Referenzen überhaupt zu behandeln. Ich war in der Lage, um es zu erhalten, indem die Serialisierung selbst die JSON.net Serializer und der Rückkehr nur json Saiten von meinen Methoden. Die JSON.net Serializer hat eine Option zirkuläre Verweise zu ignorieren als json selbst sie nicht unterstützt.

Andere Tipps

Egal, was ich tat die dynamische gehalten Proxies ein Knackpunkt zu sein, ich ging so weit, alle Zirkelverweise in meinem Modell zu entfernen! aber immer noch das Problem bestehen blieb.

Ich habe versucht Json.Net aber das gleiche Problem aufgetreten ist.

Am Ende stieß ich auf einen Beitrag über einen benutzerdefinierten mit Javascript

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

Implementiert den Code und Bobs Ihr Onkel alles funktionierte

Ich löste dies ohne auf eine externe JSON Serializer zu müssen. In einer nutshull ich deaktiviert ProxyCreation im Konstruktor meines Objektkontext.

Ich bin mir nicht sicher, warum dies funktioniert, aber ich schrieb eine Follow-up-Frage hier.

Ich habe folgendes ContractResolver. Beachten Sie, dass ich von dem CamelCaseContractPropertyResolver geerbt diese Funktion zu erhalten, wie gut, aber man kann auch nicht erbte direkt von 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);
        }
    }
}

es verwenden zu können, Serializer erstellen und dann die ContractResolver Eigenschaft auf eine neue Instanz dieser Klasse gesetzt:

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

Auch ich habe dieses Problem erfüllt. Antworten auf dieses Thema enthält Anzahl Lösungen. Loop-Referenz .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top