Wie kann ich Entity-Framework-Objekte in JavaScript-Objekte (JSON) serialisieren? Ich habe versucht, JSON.NET zu verwenden, aber ich bekomme die folgende Ausnahme, wenn ich versuche, sie zu serialisieren.
Ausnahme: Newtonsoft.Json.JsonSerializationException, Message="Selbstreferenzierungsschleife"
Hitesh
Es scheint, als hätten Sie das gleiche allgemeine Problem wie der ursprüngliche DataContract-Serializer, was zyklische Referenzen betrifft. Während Objekte, die sich gegenseitig referenzieren, ziemlich häufig bei Objektgraphen im Speicher vorkommen, führen solche zyklischen Referenzen unvermeidlich zu unendlichen Rekursionen, wenn sie serialisiert werden, wenn der Serialisierer dies nicht speziell berücksichtigt. Es gibt wenige, wenn überhaupt, etablierte Standards für den Umgang mit zyklischen Verweisen in den üblichen nicht-binären Serialisierungsformaten (XML und JSON sind die beiden häufigsten).
Microsoft hat das zyklische Problem für den DataContract-Serializer in .NET 3.5 SP1 gelöst, indem es die Ref-Semantik in XML verwendet hat. Soweit ich weiß, gibt es für JSON nichts, weshalb JSON.NET die Serialisierung Ihres Objektgraphen verhindert.
Ich würde sicherstellen, dass Sie nur Referenzen in Ihrem Objekt-Graphen haben, die navigierbar sind und nicht beide (dh nur von Eltern zu Kind, nicht von Kind zu Eltern). Diese Eltern / 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 Graphen verweist, wodurch ein indirektes zyklisches Diagramm erzeugt wird (diese sind jedoch weit weniger häufig als die Eltern / Kind-Schleifen).
Sobald Sie zyklische Referenzen in Ihrem Objektdiagramm eliminiert haben, sollten Sie in der Lage sein, zu serialisieren.
Ich hatte dieses Problem und löste es, indem ich Newtonsoft.Json.JsonIgnoreAttribute zu der Eigenschaft hinzufügte, die die Schleife verursachte. Offensichtlich wird diese Eigenschaft nicht serialisiert. Um bei diesem Problem zu helfen, habe ich normalerweise sowohl die fremde Referenz-ID als auch die fremde Klasse in meinen Entitäten. Mir ist klar, dass das nicht intuitiv ist (oder super super OO), aber es ist der Weg, den Julia Lerman in ihrem Buch "Programming Entity Framework: Code First" empfohlen hat. Ich habe festgestellt, dass es hilft, mehrere Probleme mit Entity Framework zu beheben.
%Vor%Update: Ich habe vergessen zu erwähnen, dass ich auch Proxies auf dem DbContext wie folgt deaktivieren musste:
%Vor%Wenn Sie den Code für einen Dienst schreiben (was wahrscheinlich bei der Serialisierung der Fall ist), ist dies wahrscheinlich kein Problem, aber es gibt einige Dinge, die Sie verlieren, wenn die Proxy-Erstellung deaktiviert wird. Siehe hier: Ссылка für weitere Details.
Ich verwende die MS Web API, also deaktiviere ich einfach die Proxy-Erstellung, wenn ich meinen Controller erstelle:
%Vor%Um das zu umgehen, konvertierte ich meine Entitäten in POCO basierten Code First. Um dies zu tun, klicken Sie mit der rechten Maustaste in Ihr Edmx-Fenster und wählen Sie:
Code-Generierungselement hinzufügen & gt; Code-Tab & gt; EF POCO Entity Generator.
Beachten Sie, dass Sie es möglicherweise mit nuget installieren müssen, wenn Sie es nicht sehen.
Zur Laufzeit fügt EF diesen Objekten jedoch Proxy-Klassen zu Tracking-Zwecken hinzu, die jedoch den Serialisierungsprozess stören. Um dies zu verhindern, können wir ProxyCreationEnabled einfach wie folgt auf false setzen:
%Vor%Sie können JSON.NET-serialisierte Daten dann sicher zurückgeben, indem Sie die Standardreferenzschleife wie folgt weglassen:
%Vor%Tags und Links asp.net-mvc javascript entity-framework json.net