2015-11-04 8 views
8

Ich versuche eine Entity (Entity Framework 6) in json zu serialisieren. Ich sorge dafür, dass der Eintrag im Speicher vor der Serialisierung über die AsNoTracking() -Methode ist, aber ich bekomme einen Fehler, da es keinen Wert von einer anderen Tabelle erhalten kann, die im Eintrag referenziert wird.Wie in einem JSON von Entität serialisieren?

Inner Exception: When an object is returned with a NoTracking merge option, Load can only be called when the EntityCollection or EntityReference does not contain objects. 

Exception: JsonSerializationException: Error getting value from 'TABLE_X' on 'System.Data.Entity.DynamicProxies.... 

Code:

List<Location> locations = new DbContext().Locations.Where(x => x.Type == 1).Take(5).AsNoTracking().ToList(); 
string s = JsonConvert.SerializeObject(locations, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); 

Alles, was ich tun möchte, ist eine Zeichenfolge der serialisierten Einheit zurückzukehren. Ich bin nicht besorgt über andere Objekte, nur die Orte Entität.

Wenn ich an die Verbindung versucht, Entsorgung und dann Json Serialisierung ich den Fehler erhalten: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

Ich will nur meine Liste serialisiert werden, ich will keine fremden Abhängigkeiten zurück/serialisiert.

+0

Warum brauchen Sie diese Entität zu serialisieren? – Marco

+0

Weil ich es für später in einer JSON-Datei speichern möchte. Z.B. Unit-Testing mit gültigen/wertvollen Daten. –

+0

Ich würde das Speichern von POCO-Klassen, aber jetzt EF-Entitäten verstehen, aber dann wiederum haben Sie möglicherweise andere Anforderungen. – Marco

Antwort

5

Dies ist ein EF ‚s dynamische Proxy-Problem haben Sie es deaktivieren Sie den Code

arbeiten

in Ihrer Klasse zu haben, die von DbContext

public class MyModelEntities : DbContext 
{ 
    public MyModelEntities() 
    { 
     //just disable it like this 
     Configuration.ProxyCreationEnabled = false; 
    } 
} 

Vor allem ist, was passiert erben, dass Ihr JsonConvert zu versucht, Serialisieren Sie ein Objekt wie dieses System.Data.Entity.DynamicProxies.Location_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

aufgrund des Proxy, der nicht gefunden werden kann, weil es dynamisch

erstellt wird
+0

vielen Dank! –

1

Wenn Objekt Graph nicht zu kompliziert ist, könnte ein anderer Ansatz darin bestehen, eine einfache POCO-Klasse zu erstellen, die von Location gemappt wird. Sagen wir LocationModel. Dies könnte manuell oder zum Beispiel mit AutoMapper gemappt werden.

1

Sie müssen die Methode AsNoTracking nicht aufrufen, um die benötigten Entitäten in den Speicher zu laden. Die ToList Methode wird diesen Job erledigen.

Nun zu Ihrem Problem, ist, weil der JSON-Serializer versucht, auf jede Eigenschaft auf einer Location Instanz zuzugreifen, und Sie am Ende für Ihre gesamte Datenbank abfragen können, nur weil Lazy Loading aktiviert ist. Also, haben Sie zwei Möglichkeiten:

  1. Disable Lazy loading (Wie @BRAHIMKamel empfohlen)
  2. Verwenden JsonIgnore atribute über die Navigationseigenschaften Sie wollen nicht geladen werden.

persönlich ziehe ich die ersten, und wenn ich eine Einheit mit einiger spezifischen verbundenen Einrichtung laden muß, verwende ich eager loading es als Teil der Abfrage zu laden:

context.Locations 
     .Include(l=>l.State)//eager loading an hypothetical related entity 
     .Where(x => x.Type == 1) 
     .Take(5) 
     .ToList(); 
Verwandte Themen