EF Core 6 Śledzenie obiektu

0

Cześć,
Kiedy EF Core przestaje śledzić obiekt jeśli chodzi o zmiany w kontekście?
Mam taki problem, że posiadam słownik z cache sesji zalogowanego użytkownika i w obiekcie z sesją trzymam obiekt zalogowanego operatora pobranego przez dbcontext.User.Where().
Napotkałem sytuację w której gdy aplikacja jest uruchomiona, a inną aplikacją np. mobilną zmienię coś w DB jakiś parametr tego użytkownika, to po czasie w logach EF widzę że nadpisał mi ten wiersz w DB starymi wartościami. W logach EF po wejściu do endpointa widzę "Context 'DataContext' started tracking 'SessionData' entity with key", a potem zaczynają lecieć update, mimo że dany endponit w ogóle nie dotyka tych elementów.

Repository do pobierania obiektów mam też zrobione przez GenericRepo w którym mam metodę SaveChangesAsync(), która woła: _dataContext.SaveChangesAsync(); Ale to pewnie i tak za dużo nie pomoże w kwestii tego że gdzieś dalej EF śledzi te obiekty, zastanawiam się czy jeśli EF coś pobierze i API to zwróci to czy przy kolejnym wywołaniu dalej będzie śledził ten sam obiekt, czy pobierze go znowu na nowo?

2

Zdecydowanie nie powinien go śledzić. Ale jeśli się pobiera dane tylko do wyświetlenia to można dodać AsNoTracking().
Bez kodu albo nawet jakiegoś debugowania ciężko powiedzieć. Jeszcze pokaż jak rejestrujesz ten dbcontext

0

Ale rejestrowanie jest włączone domyślnie, dane pobieram za pomocą GenericRepository, więc nie mogę tam od tak wyłączyć śledzenia bo obstawiam że wtedy jak coś pobiorę zmienię i zapisze w jednym request to SaveChanges mi tego nie złapie? Po wykonianiu requesta widzę w logach że konteskt ma Dispose, ale przy kolejnym request jak zrobie Save to znowu widzę logi start tracking wszystkiego co zostało wcześniej pobrane... DBContext jest rejestrowany za pomocą UseSqlServer, przez services.AddDbContext.
Pytanie czy problem powoduje tylko to że trzymam te elementy w cache? I gdzieś nadal jest trzymana do nich referencja i czy jeżeli się tego pozbędę to problem zniknie i sie nie pojawi przy innej okazji np. wystawie metode do zmiany hasła, przychodzi request pobieram usera, zmieniam hasło zapisuje. Teraz w innej apce ktoś zmienia hasło userowi, a przy kolejnej okazji jak w mojej nastąpi SaveChanges to znowu mu przywróci stare hasło...

2

@blane:

blane napisał(a):

, dane pobieram za pomocą GenericRepository, więc nie mogę tam od tak wyłączyć śledzenia bo obstawiam że wtedy jak coś pobiorę zmienię i zapisze w ..

Właśnie dlatego nie uzywam jakiegoś Repository. Same dbsety w sobię są repozytoriami.

To może w Cachu trzymaj jakiś zmapowany obiekt (coś w rodzaju DTO) usera. Cięzko powiedzieć co jest nie tak.

0

Wychodzi na to że trzymał sobie cały czas gdzieś referencje i mu się chyba wartość z context nie zgadzała z tym co w DB i robił update, bo usunąłem odwołania do tych obiektów DB i zaczęło działać normalnie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1