6

Oto scenariusz, mam stronę internetową, która w jednym żądaniu HTTP POST (HTTP), muszę wykonać następujące czynności:Entity Framework 4.1 - Jak "zmusić" EF, aby przejść do DB zamiast korzystania z wykresu?

  1. chwycić przedmiot (powiedzmy „Tag”)
  2. Zapisz niektóre inny obiekt (powiedzmy "Pytanie")
  3. Uzyskaj świeżą kopię "Tag".
  4. Przekieruj na inną stronę, która potrzebuje świeżej kopii "Tag".

Za kulisami 2) obejmuje wyzwalacze po stronie bazy danych, które wpływają na dane w "Tag".

Więc kiedy zrobić 3), EF ciągnie tę samą kopię obiektu z punktu 1), ponieważ jest to w/pamięci wewnętrznej wykresu (np samo połączenie/kontekstu)

muszę „świeże” kopia obiektu.

W przeszłości użyłem Detach, a następnie wykonuję kwerendę EF i najnowszy obiekt pobrany z DB.

Ale nie mam tutaj dostępu do obiektu (mam DTO, który wraca z mojego repozytorium), więc nie mam nic do przekazania do metody Detach.

Czy istnieje jakiś sposób, aby powiedzieć:

var fresh = db.Tags.Find(1, ignoreGraph: true) 

Lub czy istnieje inna alternatywa?

Jak wspomniano, jestem na Entity Framework 4.1, C# 4 (i ASP.NET MVC 3)

Jedynym rozwiązaniem widzę teraz jest przekazać parametr ciągu kwerendy do następnej strony, który następnie chwyta świeżą kopię (ponieważ jest to nowy kontekst, nowy wykres itp.).

+0

możliwe duplikat http://stackoverflow.com/questions/7639219/reload-object-in-an-entity -ramka-treść-z-zaktualizowanymi wartościami/7639578 –

+0

@nathan - być może, ale odpowiedź tam nie pomoże, ponieważ nie mam dostępu do obiektu 'umbrella' (lub obiektu' tag' tutaj) dla wywołanie 'context.Refresh (RefreshMode.StoreWins, umbrella)'. – RPM1984

+0

, a także, to jest EF4, a nie EF4.1. Wygląda na to, że metoda "Odśwież" została usunięta z DbContext. – RPM1984

Odpowiedz

13

Znaleziono moją odpowiedź, myślę:

Context.Entry<T>(entity).Reload() 

Próbuje teraz ...

+0

Nie mam dostępu do "entity", tylko "dtoEntity". – RPM1984

+1

Jeśli chcesz odświeżyć byt, musisz wiedzieć, który obiekt chcesz odświeżyć, prawda? Jeśli znasz klucz podmiotu, możesz go znaleźć w module do śledzenia zmian, a następnie ponownie go wczytać. –

+0

@ Ladislav, mam unikalny indeks, a nie podmiot. Na przykład: Find(). SingleOrDefault (x => x.UniqueUri == someUri) '. – RPM1984