Zmiana wartości właściwości przy braku śledzenia zmian (AsNoTracking)

0

Pisałem dzisiaj testy jednostkowe i podczas wykonywania testów wyszło mi, że przy pobraniu rekordu z bazy z użyciem AsNoTracking zmienia mi się jedna wartość typu bool z false na true gdy w bazie jest jest wartość false.

Mam sobie taką klasę, która jest encją:

public class Profile
{
  public Guid Id { get; set; }

  /* inne właściwości */

  public bool IsActive { get; set; }
}

var profile1 = await DbContext.Profile.SingleOrDefaultAsync(x => x.Id == id); //Tutaj IsActive przyjmuje wartość false tj tak jak bazie
var profile2 = await DbContext.Profile.AsNoTracking().SingleOrDefaultAsync(x => x.Id == id); //Tutaj IsActive przyjmuje wartość true

Ktoś może podpowiedzieć co tutaj się dzieje? Gdzie szukać przyczyny?

0

Uwielbiam te treściwe odpowiedzi...

2
altek napisał(a):

Uwielbiam te treściwe odpowiedzi...

Tak perfekcyjnie przygotowane pytania na to zasługują

1
AdamWox napisał(a):

Wystarczy poczytać w dokumentacji dlaczego tak się dzieje

When the results are returned in a tracking query, EF Core will check if the entity is already in the context. If EF Core finds an existing entity, then the same instance is returned. EF Core won't overwrite current and original values of the entity's properties in the entry with the database values.

Ale czy to tłumaczy to zachowanie?

Bo dla mnie to brzmi po prostu jako cache, a tu się zmienia mu wartość :o dafq?

0

Moim zdaniem tłumaczy. To jest coś na zasadzie default value. Jeśli jest NoTracking() to EF zakłada, że pole IsActive powinno być true i taką przypisuje mu wartość. Pytanie czy autor nie ma gdzieś w DbContext skonfigurowane jaką domyślną wartość powinno mieć IsActive, albo jest wyliczana na podstawie ustawień tabeli i EF tak tworzy obiekt.

Może błędnie to rozumiem. Chętnie sprawdzę, czy u mnie w projekcie też takie coś się dzieje. Dam znać 👌

2
AdamWox napisał(a):

Moim zdaniem tłumaczy. To jest coś na zasadzie default value. Jeśli jest NoTracking() to EF zakłada, że pole IsActive powinno być true i taką przypisuje mu wartość.

Ee coś bajerujesz chyba. Bool default to jest false. Bardziej obstawiam, że pomiędzy wywołaniami jest jakaś logika co coś zmienia. Nie ważne czy wywołujesz AsNoTracking czy nie wynik powinien być taki sam.

1

Zgadza się. U mnie żadna wartość nie uległa zmianie, a sprawdziłem na wielu przykładach w swoich projektach i nie tylko bool. Oba obiekty są takie same, więc zakładam, że OP zrobił jakąś logikę pomiędzy, a tutaj wkleił tylko to co najważniejsze i stwierdził, że jest błąd w AsNoTracking() 👌🤔

1

@AdamWox

Jeśli jest NoTracking() to EF zakłada, że pole IsActive powinno być true i taką przypisuje mu wartość. Pytanie czy autor nie ma gdzieś w DbContext skonfigurowane jaką domyślną wartość powinno mieć IsActive, albo jest wyliczana na podstawie ustawień tabeli i EF tak tworzy obiekt.

przecież to byłoby jakieś absurdalne zachowanie

Jeżeli pobieram encje z bazy i dostaje IsAdmin = false

A pozniej odszukuje jej jeszcze raz i przestaje ją trackować (no bo np. nie zamierzam robic update), to jaką logiką ktoś by musiał się posługiwać aby uznać że sensownym jest zwrócenie tej encji z wartością IsAdmin = true?

0

Masz rację. Wydawało mi się, że kwestia AsNoTracking() ma na celu ustawić domyślną wartość jaką się skonfiguruje w kontekście. Można w DbContext ustawić jakąś domyślną wartość dla pola i dla bool wcale nie musi być false. Byłem przekonany, że AsNoTracking() wstawia wartości domyślne, ale to kompletnie nie powinno mieć miejsca i oba zapytania powinny zwrócić takie same wartości.

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