Do wykonywania aktualizacji wsadowych używam biblioteki EntityFramework.Extended . Jedynym problemem jest to, że EF nie śledzi aktualizacji wsadowych wykonywanych przez bibliotekę. Więc kiedy pytam DbContext
ponownie, nie zwraca zaktualizowanych jednostek.
Odkryłem, że użycie AsNoTracking()
metody podczas odpytywania wyłącza śledzenie i pobiera świeże dane z bazy danych. Jednak ponieważ EF nie śledzi jednostek, z AsNoTracking()
którymi przeprowadzono zapytanie , nie mogę wykonać żadnej aktualizacji danych, których dotyczyło zapytanie.
Czy istnieje sposób, aby wymusić EF, aby uzyskać najnowsze dane podczas śledzenia zmian?
c#
asp.net-mvc
entity-framework
dbcontext
Saravana
źródło
źródło
Odpowiedzi:
Spróbuj tego, aby odświeżyć pojedynczą jednostkę:
Edycja: aby uzyskać świeże dane dla zbioru encji, warto spróbować pozbyć się
DbContext
instancji po każdym żądaniu.źródło
DbSet
.Natknąłem się na to pytanie, szukając rozwiązania problemu, który miałem, w którym właściwości nawigacji nie wypełniały się po zaktualizowaniu jednostki. Za każdym razem, gdy próbowałem ponownie załadować jednostkę z bazy danych, pobierał on zamiast tego wpis z lokalnego magazynu, który nie wypełniłby właściwości nawigacji przez leniwe ładowanie. Zamiast niszczyć kontekst i odtwarzać go, odkryłem, że pozwoliło mi to uzyskać świeże dane przy działających serwerach proxy:
Logika, która się za tym kryła, polegała na tym, że moja aktualizacja dołączyła jednostkę, aby śledzić zmiany w niej. To dodaje go do lokalnego sklepu. Później wszelkie próby odzyskania jednostki z funkcjonalnymi serwerami proxy skutkowałyby przechwyceniem jednostki lokalnej zamiast wychodzenia do bazy danych i zwracania nowej jednostki obsługującej proxy. Wypróbowałem powyższą opcję przeładowania, która odświeża obiekt z bazy danych, ale to nie daje obiektu proxy z leniwym ładowaniem. Próbowałem zrobić
Find(id), Where(t => t.Id = id), First(t => t.Id = id)
. Na koniec sprawdziłem dostępne stany, które zostały dostarczone i zobaczyłem, że jest stan „Odłączony”. Eureka! Mam nadzieję, że to komuś pomoże.źródło
Uruchomienie kodu w tym samym kontekście nie przyniesie zaktualizowanych jednostek. Doda tylko nowe jednostki utworzone w bazie danych między uruchomieniami. Wymuszone przeładowanie EF można wykonać w następujący sposób:
ObjectQuery _query = Entity.MyEntity; _query.MergeOption = MergeOption.OverwriteChanges; var myEntity = _query.Where(x => x.Id > 0).ToList();
źródło
Zadeklarowałem zmienną encji, bez przypisania, jako część klasy. Pozwoliło mi to pozbyć się instancji bez utraty zmiennej dla odniesienia przez inne metody. Właśnie natknąłem się na to, więc nie ma zbyt wiele czasu wykonywania, ale jak dotąd wydaje się, że działa dobrze.
public partial class frmMyForm { private My_Entities entity; public frmMyForm() { InitializeComponent(); } private void SomeControl_Click(object sender, EventArgs e) { db.SaveChanges(); db.Dispose(); entity = new My_Entities(); //more code using entity ... }
źródło
Dla mnie ... mam dostęp do mojego DbContext w następujący sposób:
Aby zmusić EF do trafienia do bazy danych, robię to:
_viewModel.Repo.Context = new NewDispatchContext();
Zastępowanie bieżącego DbContext nowym wystąpieniem. Następnie następnym razem, gdy korzystam z usług danych, pobierają dane z bazy danych.
źródło