Serialisieren Sie Entity Framework-Objekte in JSON

asp.net-ajax entity-framework json wcf

Frage

Es scheint, dass die Serialisierung von Entity Framework-Objekten in JSON nicht möglich ist, wenn der native DataContractJsonSerializer von WCF oder der native JavaScript-Serializer von ASP.NET verwendet wird. Dies liegt an den Referenzzählproblemen, die beide Serialisierer ablehnen. Ich habe auch Json.NET ausprobiert , was auch speziell bei einem Referenzzähler-Problem fehlschlägt.


Bearbeiten: Json.NET kann jetzt Entity Framework-Entitäten serialisieren und deserialisieren .


Meine Objekte sind Entity Framework-Objekte, die zur Ausführung zusätzlicher Geschäftsfunktionen (z. B. Authentifizierung usw.) überlastet sind. Ich möchte diese Klassen nicht mit plattformspezifischen Attributen usw. dekorieren, da ich eine plattformagnostische API präsentieren möchte .

Ich habe tatsächlich über die einzelnen Schritte gebloggt, die ich unter https://blog.programx.co.uk/2009/03/18/wcf-json-serialization-woes-and-a-solution/ durchlaufen habe.

Habe ich etwas offensichtlich übersehen?

Akzeptierte Antwort

Ich mache das, indem ich die Daten, die ich serialisieren möchte, in einen anonymen Typ projiziert und diese serialisiert. Dadurch wird sichergestellt, dass nur die Informationen, die ich eigentlich in der JSON haben möchte, serialisiert werden und ich nicht versehentlich etwas weiter unten im Objektdiagramm serialisiert. Es sieht aus wie das:

var records = from entity in context.Entities
              select new 
              {
                  Prop1 = entity.Prop1,
                  Prop2 = entity.Prop2,
                  ChildProp = entity.Child.Prop
              }
return Json(records);

Ich finde anonyme Typen, die dafür ideal sind. Dem JSON ist es offensichtlich egal, mit welchem Typ er produziert wurde. Anonyme Typen geben Ihnen vollständige Flexibilität hinsichtlich der Eigenschaften und der Struktur, die Sie in den JSON einfügen.


Beliebte Antwort

Microsoft hat einen Fehler in der Art und Weise gemacht, wie EF-Objekte zu Datenverträgen gemacht wurden. Sie enthielten die Basisklassen und die Backlinks.

Am besten erstellen Sie für jede der Entitäten, die Sie zurückgeben möchten, gleichwertige Data Transfer Object-Klassen. Dazu gehören nur die Daten, nicht das Verhalten und nicht die EF-spezifischen Teile einer Entität. Sie würden auch Methoden zum Übersetzen in und aus Ihren DTO-Klassen erstellen.

Ihre Dienste würden dann die Datenübertragungsobjekte zurückgeben.



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