Was setzt LazyLoadingEnabled in meinem EF-Kontext auf "false"?

8

Zuerst EF5-Datenbank verwenden. Bei der Erstellung meines Kontexts setze ich ContextOptions.LazyLoadingEnabled auf true . Etwas ändert sich in false (nirgendwo in unserem Code ist diese Einstellung geändert).

An verschiedenen Stellen überprüfe ich, ob es immer true ist, indem ich dieses Code-Snippet (Abrufen des Kontexts von einem Entitätsobjekt). Das Problem tritt nur auf, wenn mehrere Threads ausgeführt werden (laden Sie einige Entitäten und geben Sie sie dann durch Multithread-Code). Es tritt nicht an irgendeinem konsistenten Punkt im Code auf, daher ist es unmöglich zu bestimmen, was genau das verursacht.

Ich denke, ich hoffe nur, dass jemand mehr über die internen Abläufe von EF weiß und mir einen Hinweis gibt ...

    
dudeNumber4 12.03.2013, 20:07
quelle

2 Antworten

1

LazyLoadingEnabled bestimmt, ob verwandte Objekte automatisch geladen werden, wenn auf eine Navigationseigenschaft zugegriffen wird.

Ich erinnere mich daran, dies in Julie Lermans Buch zu lesen: EF von Julie Lerman programmieren

Sie benötigen einen dynamischen Proxy zum Lazy Loading. Sie benötigen eine öffentliche Klasse mit virtuellen Navigationseigenschaften.

    
phil soady 19.05.2013 14:34
quelle
0

Ein Entity Framework-Kontext ist nicht Thread-sicher. Das Problem tritt auf, wenn mehrere Threads auf eine Eigenschaft zugreifen, die faul geladen ist. Intern deaktiviert EF das lazy loading, wenn der Wert einer NavigationProperty überprüft und anschließend wieder aktiviert wird. (Siehe RelatedEnd.DisableLazyLoading() )

Was also in Ihrem Fall passiert, geht wahrscheinlich so: Ein Thread greift gerade auf eine Navigationseigenschaft zu und vor dem Beenden versucht ein anderer Thread auf eine Navigationseigenschaft eines Objekts zuzugreifen, das an denselben Kontext gebunden ist. Zu diesem Zeitpunkt wird das träge Laden vorübergehend abgeschaltet und somit werden keine Daten geladen.

EF gibt ausdrücklich an, dass der ObjectContext nicht threadsicher ist. Daher ist es wahrscheinlich eine gute Idee, sicherzustellen, dass kein gleichzeitiger Zugriff von verschiedenen Threads erfolgt.

    
GaussZ 05.05.2015 14:31
quelle