Wir schreiben eine WPF-Anwendung mit Entity-Framework (Silverlight mit RIA-Services, um genau zu sein). Wir verwenden einen gemeinsamen ObjectContext über die Anwendung, sodass wir von der gemeinsamen Nutzung von Daten in den Modulen profitieren können.Entity Framework ObjectContext in Windows/WPF/Silverlight-Anwendung
Das Problem ist - wenn Benutzer während seiner Arbeit geöffnet wird sagen wir historische Verkäufe, wird es in den ObjectContext geladen und bleibt dort bis zum Ende der Anwendung. Also sollte ein anderes Muster verwendet werden.
Ich weiß, dass ObjectContexts als einzelne Unit-of-Work verwendet werden sollte. Aber wie können Sie anderen Teilen der Anwendung mitteilen, dass sich etwas geändert hat und sie ihre Daten neu laden sollten?
Edit: Ok, EventAggregator, aber dann würde dies dazu führen, dass alle anderen Teile ihre (wahrscheinlich viel davon doppelt) Daten neu laden. Wahrscheinlich werden auch viele Ereignisse für alle Arten von Gruppen benötigt.
Wie lösen Sie diese Probleme? Meine aktuelle Lösung ist eine Art Kompromiss: Verwenden Sie einen gemeinsamen ObjectContext für die Kerndaten, die von der gesamten Anwendung verwendet werden, damit sie automatisch freigegeben und aktualisiert werden können. Und für die große Menge an Daten, verwenden Sie einen neuen separaten ObjectContext. Irgendwelche besseren Ideen?
Gibt es eine Möglichkeit, Entitäten aus ihrem DataContext "freizugeben", damit der Garbage Collector seine Arbeit erledigen und den Speicher freigeben kann?
Mit dieser Anwendung sprechen wir über Silverlight. Mit Prism/Caliburn glaube ich, dass es kein Problem ist, einen einzelnen ObjectContext pro Sicht (Modul?) Zu haben. Auch hier ist das Problem, wenn viele Daten auf den Client geladen werden sollen. Soweit ich jetzt bin, wäre die beste Lösung, einen gemeinsamen ObjectContext für grundlegende Entitäten zu erstellen, die durch die gesamte Anwendung verwendet werden, so dass diese automatisch synchronisiert werden, und separate ObjectContexts zum Laden großer Datenmengen in z. einige historische Berichte. – gius
Ich würde nicht versuchen, wirklich große Datenblöcke an den Client zu senden. Stattdessen würde ich auf dem Server filtern und nur die Ergebnisse zurückgeben, die der Client in diesem Moment sehen möchte. Menschen können 100.000 Datensätze nicht lesen, also senden Sie diese nicht an einen Menschen. Lassen Sie das Problem stattdessen eine Suche/Filter und senden Sie die Ergebnisse nur an den Client. Wenn Sie Berichte erstellen, erstellen Sie die zusammengefassten Übersichtsdaten auf dem Server. Zum Beispiel wäre es besser, das monatliche Umsatzvolumen auf dem Server zu berechnen und eine einzelne Zahl an den Kunden zu senden, als an 5000 Verkaufsdatensätze. –
Das stimmt, aber wenn der Benutzer während der Anwendungslebenszeit, sagen wir mal, die Seiten 1, 10, 20 sieht, sind diese Daten immer noch im Speicher. Auf der anderen Seite könnte die Verwendung eines separaten ObjectContext- und Daten-Paging das Problem der großen Daten, die im Arbeitsspeicher bleiben, lösen. – gius