none
Entity Framework Reload context RRS feed

  • 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

    Freitag, 25. September 2015 23:39

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

    Samstag, 26. September 2015 06:34
    Beantworter

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

    Samstag, 26. September 2015 06:34
    Beantworter
  • 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



    Samstag, 26. September 2015 20:30
  • 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

    Sonntag, 27. September 2015 12:52
    Beantworter