Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Lebensdauer von DataContext / DbContext - Wie lange offen halten?
Cannon
myCSharp.de - Member



Dabei seit:
Beiträge: 282

Themenstarter:

Lebensdauer von DataContext / DbContext - Wie lange offen halten?

beantworten | zitieren | melden

Nach einigen Experimenten mit dem Context unter dem Entity Framework (mit SQL-Server) konnte ich feststellen, dass Änderungen der Datenbank erst dann bemerkt werden, wenn der Context verworfen und neu erzeugt wird. Das heißt das ETF cacht sozusagen alle geladenen Datensätze (LazyLoading ist aktiviert). Jetzt gab es verschiedene Ideen:

1. Der Context bleibt solange am Leben, wie quasi die Datenbank benötigt wird - im Zweifelsfall solange, wie die Anwendung läuft. Vorteil: Ein Datenzugriff passiert nur dann, wenn Änderungen erfolgen und NICHT bei jedem Anzeigen der Daten. Nachteil: Ich bemerke andere (externe) Änderungen der Daten nicht - könnte das aber z.B. mit einem ChangeNotifier abfangen.

2. Der Context wird für den einmaligen Datenzugriff erzeugt und dann wieder verworfen, bleibt also in meinem Beispiel unter WPF nur für das aktuelle ViewModel aktiv, danach wird er wieder verworfen. Vorteil: Die Daten sind meist aktuell. Nachteil: Ich muss bei jedem Öfnen eines ViewModels alle Daten von der Datenbank erneut laden. Wenn das ViewModel lange offen steht, kann es sein, dass Daten dennoch nicht mehr aktuell sind.

Welche Methode ist die bessere unter der Maßgabe, dass die Anbindung zur Datenbank auch übers Internet oder VPN laufen kann? Oder gibt es ganz andere Gedankenansätze?
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7561
Herkunft: Waidring

beantworten | zitieren | melden

Hallo Cannon,

der Context ist im Grunde eine "Unit of Work", also auf deutsch: eine Arbeitseinheit. Somit sollte der Context auch so gehandhabt werden. Was jetzt allerdings eine "Arbeitseinheit" ist hängt sehr von deiner Anwendung ab. Siehe Entity Framework Context Lifetime Best Practices und How to decide on a lifetime for your ObjectContext
Zitat
Nachteil: Ich muss bei jedem Öfnen eines ViewModels alle Daten von der Datenbank erneut laden.
Nicht unbedingt. Du könntest dir die Daten ja lokal selbst z.B. in einer ObservableCollection<T> halten und nur bei Änderungen an der Collection od. an T die Datenbank atualisieren bzw. wenn du ein neues ViewModel erstellst die Daten aus DB mit jenen in der ObservableCollection<T> abgleichen (mittels Load und !Contains). Aber das hängt auch von deiner Anwendung ab ob das überhaupt sinnvoll ist.

Siehe auch Forumssuche nach unit of work


mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
private Nachricht | Beiträge des Benutzers
Cannon
myCSharp.de - Member



Dabei seit:
Beiträge: 282

Themenstarter:

beantworten | zitieren | melden

Ich arbeite bereits mit UnitOfWork und Repositories.

Auch, wenn ich die Artikel lese, hilft es mir nicht weiter, da sich mir nicht genau der Grund erschließt. Im Falle von WPF geht es darum die UnitOfWork pro ViewModel zu "erneuern". Aber warum? Ist SqlChangeNotifier nicht die bessere Alternative?
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

SqlChangeNotifier ist nicht die beste Wahl.
Verbindngsabbruch, Last bei vielen Usern....

Besser ist es da bei jedem Eintrag einen Zeitstempel zu erstellen und diesen zu vergleichen.
Jeder meiner Entities hat ein TimestampCreated und TimestampLastUpdated. Wenn ein Submit erfolgt überprüfe ich, ob sich Updated geändert hat und wenn ja send ich ne Warnung raus mit den Optionen den letzten Eintrag anzusehen, zu überschreiben oder zu verwerfen.

Andere Systeme locken eine Entity während einer Bearbeitung, sodass nur einer einen Eintrag bearbeiten kann.
Gibt verschiedene Varianten, je nach Geschmack. Aber das ist keine Besonderheit des EF, sondern gilt quasi für alle Varianten einer DB Verbindung.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Cannon
myCSharp.de - Member



Dabei seit:
Beiträge: 282

Themenstarter:

beantworten | zitieren | melden

@Abt: In diese Fall geht es ja nicht darum Änderungen zu verfolgen, sondern um darüber zu reden, warum die UnitOfWork oder auch der DbContext nur eine "kurze" Lebensdauer haben sollte.

Ich sehe halt einfach die Gefahr, dass ich die Daten ständig vom Server lade, obwohl das unnötig wäre. Auf der anderen Seite sehe ich die Aktualisierung der Datensätze nicht, wenn ich die UnitOfWork auf Dauer behalte und irgendwann ist auch die gesamte Datenbank im Speicher gecacht. ;)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16145

beantworten | zitieren | melden

.. weil jede Datenbankverbindung nur solange offen gehalten werden sollte wie nötig.
[Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen

Wenn Du Aktualisierungen abonnieren willst dann schalt nen WCF dazwischen.
Der hat ne Connection an die DB und kriegt diese mit und pusht Info an die Clients. Das ist deutlich schonender als Dein Vorhaben.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers