Laden...

DbContext bei Multi-User Anwendung gibt veraltete Daten wieder

Erstellt von DanielK vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.394 Views
D
DanielK Themenstarter:in
2 Beiträge seit 2012
vor 10 Jahren
DbContext bei Multi-User Anwendung gibt veraltete Daten wieder

verwendetes Datenbanksystem: <MSSQL>

Hallo zusammen!
Ich schreibe ein Multi-User Programm, welches Datensätze in verschiedenen Clients anzeigt und zur Bearbeitung frei gibt. Dennoch sollten alle Clients in regelmäßigen Abständen die gleichen Daten aus der DB bekommen.

Nun zu der eigentlichen Frage…

Die Objekte werden regelmäßig von einem Thread ( alle ~30 Sekunden derzeit ) aus der DB abgefragt und beim ersten Abfragen vollkommen richtig angezeigt. Sollte ein anderer Client oder in der DB jedoch ein Wert geändert werden, ist keine Änderung bei anderen Clients sichtbar. Der Lokale Context bekam die Änderung mit und zeigt sie auch Fehlerfrei, während die anderen Clients weiterhin den alten, falschen, Wert bekommen.

Wie kann ich dafür Sorgen das alle Clients immer die aktuellen Werte aus der Datenbank bekommen?

Beispiel:
Das Objekt Property Order.StateId == 1 wird bei einem Client auf 2 geändert. In der DB und dem Client der die Änderung ausführte ist die ID nun auf 2 gesetzt, während alle anderen Clients trotz neuem Abfragen des Contexts die 1 als Ausgabe bekommen.

public IQueryable<T> All()
        {
        	return _context.Set<T>().AsQueryable();
        }

Problem ist, dass die Daten nicht frisch aus der DB kommen.

MfG
Daniel

M
402 Beiträge seit 2005
vor 10 Jahren

Hi...

Wann bzw. wie instanzierst du den DbContext?

Wenn der DbContext beim Starten instanziert und bis zum Schließen der Anwendung weiterverwendet wird könnte dabei dieses Verhalten rauskommen.

lg

F
115 Beiträge seit 2012
vor 10 Jahren

Huhu,

hast Du nach der Änderung ein COMMIT durchgeführt? Sonst ist die Änderung nur in der eigenen Transaktion zu sehen.

Gruß
f_igy

D
DanielK Themenstarter:in
2 Beiträge seit 2012
vor 10 Jahren

@ M@TUK

Derzeit wird unser DbContext beim Start instanziert und dann weiterverwendet.
Wäre es denn eher sinniger den DbContext zu verwerfen und neu generieren zu lassen?

Das hier ist übrigens die Stelle zur DbContext instanzierung.

public UnitOfWork()
        {
            if (_context == null)
            {
                _context = new UltranizerV2Context(this);
                
            }
        }

MfG

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo DanielK,

schau dir dazu auch Lebensdauer von DataContext / DbContext - Wie lange offen halten? an.

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!"

M
402 Beiträge seit 2005
vor 10 Jahren

@DanielK

"UnitOfWork" aus deinem Code-Schnippsl wäre genau das richtige Stichwort.

Da ihr den DbContext aber beim Start instanziert und weiterverwendet, hat der Einsatz des Begriffs im Code wohl nur eine symbolische Bedeutung... 😉

lg