Benutzer mit den meisten Antworten
Entity Framework Reload context

Frage
-
Hallo Experten,
Ich habe ein komplexes Stammdaten Form, mit Stammdaten eines Beraters und einem Tabcontrol mit Kindtabellen, z.B. Stundensätze für unterschiedliche Tätigkeiten. Im Tabcontrol Stundensätze werden in einem Datagridview die angelegten Stundensätze angezeigt. Geladen wird das Datagridview in einer Routine mit folgendem Code.
var stdsatzs = context.Stundensatzs .Where(s => s.BeraterID == berid) .OrderBy(s => s.GueltigAb) .ToList(); stundensatzBindingSource.DataSource = stdsatzs;
Die Wartung dieser Stundensätze erfolgt aber in einem eigenen Fenster. Werden nun in diesem Fenster Änderungen oder Neuanlagen von Stundensätzen durchgeführt, wird nach der Rückkehr aus dem Änderungsfenster die obige Routine wieder ausgeführt. Es werden aber anscheinend die Daten nicht neu geladen, obwohl die Daten sich inzwischen geändert haben.
Wie kann ich Entity Framework dazu bringen diese Tabelle neu zu laden?
Vielen Dank im Voraus
Siegfried
Antworten
-
Hallo Siegfried,
Dein Problem dürfte daran liegen, dass Du den "context" global verwendest, anstatt wie allgemein empfohlen nur für eine Unit of Work. Das EF cacht dann intern die Daten für einen Context und verwendet sie weiter. Siehe dazu 3 Caching in the Entity Framework
Wenn Du den globalen Context nicht aufgeben kannst oder willst, so könntest Du solche Abfragen mit NoTracking ausführen, damit wird das Abfrageergebnis nicht zwischengespeichert und so jedes Mal neu ausgeführt.
Gruß Elmar
- Als Antwort markiert Siegfried Reichmann Samstag, 26. September 2015 21:12
Alle Antworten
-
Hallo Siegfried,
Dein Problem dürfte daran liegen, dass Du den "context" global verwendest, anstatt wie allgemein empfohlen nur für eine Unit of Work. Das EF cacht dann intern die Daten für einen Context und verwendet sie weiter. Siehe dazu 3 Caching in the Entity Framework
Wenn Du den globalen Context nicht aufgeben kannst oder willst, so könntest Du solche Abfragen mit NoTracking ausführen, damit wird das Abfrageergebnis nicht zwischengespeichert und so jedes Mal neu ausgeführt.
Gruß Elmar
- Als Antwort markiert Siegfried Reichmann Samstag, 26. September 2015 21:12
-
Hallo Elmar,
Danke für Deine Erklärungen und die Links, konnte es zwar nicht direkt umsetzen, NoTracking hat mich aber auf die richtige Spur geführt.
Die Lösung meines Problems:
var stdsatzs = context.Stundensatzs .AsNoTracking() .Where(s => s.BeraterID == berid) .OrderBy(s => s.GueltigAb) .ToList();
Grüße,
Siegfried
- Bearbeitet Siegfried Reichmann Samstag, 26. September 2015 20:37
-
Hallo Siegfried,
schön das es immerhin schon mal funktioniert!
Doch Du solltest Dich mit der Thematik auf der Seite intensiv auseinandersetzen und zu verstehen suchen, warum dies notwendig ist und welche Konsequenzen es hat. Die Grundlagen zu verstehen ist in dem Umfeld sehr wichtig.
Gruß Elmar