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 ...
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.
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.
Tags und Links entity-framework entity-framework-5