2016-04-13 9 views
2

Mit JSON.Net Ich möchte es so konfigurieren, dass wenn Serialisierung ein Entity Framework-Objekt, wird es vollständig tun, was bereits abgerufen und in .NET-Speicher Deaktivieren Sie im Wesentlichen zusätzliche Fahrten zur Datenbank.Mit JSON.Net, wenn Objekt Entity Framework Serialisierung, deaktivieren Reisen in die Datenbank

Ich habe eine gleichwertige Frage für nHibernate gefunden, aber ich weiß nicht, wie ich es für EF machen soll.

+0

Beziehen Sie sich darauf, die Navigationseigenschaften zu serialisieren? – Dhanuka777

Antwort

0

Sie müssen das gesamte Objekt manuell holen, indem Sie .Include() für alle Navigationseigenschaften verwenden, die serialisiert werden, so dass sie vor der Serialisierung aus der DB geladen wurden. Andernfalls wird jede Eigenschaft, die Lazy Loading ermöglicht, aus der Datenbank mit einer separaten Abfrage abgerufen - für eine Eigenschaft ist es 1 Abfrage, für die Sammlung ist es 1 Abfrage pro Sammlungselement, und dann wird der Prozess für jede Lazy geladene Entität wiederholt, bis das gesamte Diagramm serialisiert ist .

Es ist auch eine sehr schlechte Praxis, Entity Framework-Proxies oder Domain-Entities zu serialisieren, was wahrscheinlich zu einer Reihe unterschiedlicher Probleme führen könnte: N + 1, nicht abgerufene Daten, zu viele serialisierte Eigenschaften, eine zusätzliche Eigenschaft erforderlich Zum serialisierten Objekt usw. hinzufügen. Ich schlage vor, zu DTOs zu wechseln, die Sie serialisieren und nur diese zurückgeben, und Ihre Entity Framework-Entitäten diesen DTOs zuzuordnen.

+0

Obwohl Sie Recht haben, beantwortet dies nicht seine Frage, sondern bietet einen Workaround. – Toxantron

+0

@Toxantron seine Frage war über Ausflüge in die Datenbank - die Antwort ist, Include() zu verwenden, um lazy geladene Eigenschaften zu holen, glaube ich. –

+0

Seine Fragen besagt, dass er nur das serialisieren will, was bereits abgerufen wurde. Das Deaktivieren von Lazy Loading wäre der Weg zu IMO. – Toxantron

1

können Sie verzögertes Laden deaktivieren, indem Sie das Kontextkonfigurationseinstellung, und Sie können auch deaktivieren Proxies

// Disable lazy loading 
context.Configuration.LazyLoadingEnabled = false; 
// Disable proxies 
context.Configuration.ProxyCreationEnabled = false; 

Schaffung Aber wie andere bereits darauf hingewiesen, das ist schlechtes Design und Sie sollten das Senden EF Objekte überhaupt überdenken und eher erstellen DTOs mit LinQ.

Bearbeiten: In den Kommentaren einer anderen Antwort wurde von @raderick darauf hingewiesen, dass dies Nebenwirkungen haben kann. Ich empfehle daher, es wieder einzuschalten, wenn Ihr Kontext nach dem Serialisieren der Objekte noch verwendet wird. Beachten Sie, dass Objekte, die mit ProxyCreationEnabled = false erstellt wurden, beim Einschalten nicht zu Proxies konvertiert werden.

// Reactivate lazy loading 
context.Configuration.LazyLoadingEnabled = true; 
Verwandte Themen