Entity Framework-Objekt mit Json.Net serialisieren

asp.net-mvc entity-framework javascript json.net

Frage

Wie kann ich ein Entity-Framework-Objekt in ein JavaScript-Objekt (JSON) serialisieren? Ich habe versucht, JSON.NET zu verwenden, erhalte jedoch die folgende Ausnahme, wenn ich versuche, es zu serialisieren.

Ausnahme: Newtonsoft.Json.JsonSerializationException, Message = "Selbstreferenzierungsschleife"

Hitesh

Akzeptierte Antwort

Es scheint, als hätten Sie das gleiche allgemeine Problem wie der ursprüngliche DataContract-Serialisierer in Bezug auf zyklische Referenzen. Während Objekte, die sich gegenseitig referenzieren, relativ häufig mit Objektgraphen im Speicher verwendet werden, führen solche zyklischen Referenzen unweigerlich zu unendlichen Rekursionen, wenn sie serialisiert werden, wenn der Serializer dies nicht speziell berücksichtigt. Wenn überhaupt, gibt es nur wenige etablierte Standards für den Umgang mit zyklischen Referenzen in den gebräuchlichen nicht-binären Serialisierungsformaten (XML und JSON sind die beiden häufigsten).

Microsoft hat das zyklische Problem für den DataContract-Serialisierer in .NET 3.5 SP1 mithilfe der Ref-Semantik in XML gelöst. Meines Wissens gibt es für JSON keine solche Sache, weshalb JSON.NET Sie daran hindern kann, Ihr Objektdiagramm zu serialisieren.

Ich würde sicherstellen, dass Sie nur Verweise in Ihrem Objektdiagramm haben, die in eine Richtung navigierbar sind, und nicht auf beide Arten (dh nur von Elternteil zu Kind, nicht von Kind zu Elternteil). Diese Elternteile / Kinder und Kinder / Eltern sind die häufigsten Arten von zyklischen Referenzen. Es kann auch sein, dass ein untergeordnetes Kind letztlich auf die Wurzel des Diagramms verweist, wodurch ein indirektes zyklisches Diagramm erstellt wird (diese sind jedoch weitaus weniger häufig als die Eltern- / Kind-Schleifen.)

Wenn Sie alle zyklischen Verweise in Ihrem Objektdiagramm entfernt haben, sollten Sie in der Lage sein, die Serialisierung durchzuführen.


Beliebte Antwort

Ich hatte dieses Problem und löste es, indem ich der Eigenschaft, die die Schleife verursacht, das Newtonsoft.Json.JsonIgnoreAttribute hinzufügte. Offensichtlich wird diese Eigenschaft nicht serialisiert. Um bei diesem Problem zu helfen, habe ich normalerweise sowohl die Fremdreferenz-ID als auch die Fremdklasse in meinen Entitäten. Mir ist klar, dass dies nicht intuitiv ist (oder super tolles OO), aber es ist der von Julia Lerman in ihrem Buch "Programming Entity Framework: Code First" empfohlene Weg. Ich habe festgestellt, dass es einige Probleme mit Entity Framework löst.

 public class SomeEntity
 {
      [JsonIgnore]
      public ForeignEntity SomeForeignEntity {get;set;}
      public Guid ForeignEntityId {get;set;}
 }

Update: Ich habe vergessen zu erwähnen, dass ich auch Proxies auf DbContext deaktivieren musste:

dataContext.Configuration.ProxyCreationEnabled = false;

Wenn Sie den Code für einen Dienst schreiben (was bei der Serialisierung wahrscheinlich ist), ist dies wahrscheinlich kein Problem, aber es gibt einige Dinge, die Sie verlieren, wenn die Proxy-Erstellung deaktiviert ist. Weitere Informationen finden Sie hier: http://www.sellsbrothers.com/posts/Details/12665 .

Ich verwende die MS Web Api, also deaktiviere ich einfach die Proxy-Erstellung, wenn ich meinen Controller konstruiere:

public class MailingApiController : ApiController
{
    public MailingApiController()
    {
        PreventDeepSerialization();
    }

    private static void PreventDeepSerialization()
    {
        var dataContext = Injector.Get<IIntertwyneDbContext>();
        dataContext.Configuration.ProxyCreationEnabled = false;
    }
      ....


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum