2011-10-05 7 views
7

Mam witrynę zarządzającą zbiorem reguł i osobną aplikacją formularza Windows, która dokonuje zmian poziomu plików na podstawie reguł w bazie danych.Jak wymusić kod EF Najpierw zapytać bazę danych?

Obie te aplikacje używają tych samych bibliotek dla kodu EF First DbContext, ale każda aplikacja tworzy własną kopię kontekstu.

Problem polega na tym, że każda działająca wersja kontekstu nie jest świadoma zmian wprowadzonych przez inną wersję. Na przykład. Jeśli zmienię regułę na stronie, aplikacja formularzy nadal będzie miała poprzednią wersję.

Jestem świadomy, że prawdopodobnie zajmuję się tym niewłaściwym sposobem i powinienem mieć jakiś dostęp do danych poprzez JSON/REST z witryny do aplikacji formularzy, ale wolałbym nie z innych powodów.

Czy istnieje sposób, aby "wyłączyć buforowanie" w kontekście i zmusić każde zapytanie do trafienia w DB?

Odpowiedz

10

Nie ma możliwości wyłączenia buforowania. Musisz ręcznie ustawić każde zapytanie, aby wprowadzić prawdziwe dane. Ta funkcja nie jest dostępna z DbContext API => musisz używać ObjectContext API.

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
ObjectSet<YourEntity> set = objectContext.CreateObjectSet<YourEntity>(); 
set.MergeOption = MergeOption.OverwriteChanges; 
var query = from x in set where ... select x;  

Albo prościej scenariusz: stosować lepsze zarządzanie kontekstowe, jeśli to możliwe, zamiast uruchamiania zapytań w tym samym kontekście nami nowy.

Przy okazji. Pomysł na to, aby serwis był odsłonięty w aplikacji WinForm i pochłonięty przez witrynę internetową jest błędny. Będziesz potrzebował trzeciej aplikacji usługowej (hostowanej na serwerze WWW lub jako usługa Windows), a zarówno witryna internetowa, jak i aplikacja WinForm będą uzyskiwać dostęp do bazy danych za pośrednictwem tej nowej aplikacji. EF będzie tylko w nowej aplikacji.

Edit:

Jeśli aplikacja WinForm nie dokonywać zmian danych ładowanych z bazy danych można również użyć tego:

var query = from x context.YourEntities.AsNoTracking() where ... select x; 

To wyłączy śledzenie zmian wewnętrznych podmiotów i powinien również zmusić EF do ponownego załadowania obiektu za każdym razem, ale znacznie utrudni to zapisywanie zmian.

+0

Podoba mi się prostszy scenariusz :) Obecnie mam repozytorium utworzone przez DI za pośrednictwem konstruktora. Sądzę, że będę musiał to odrzucić i użyć Lokalizatora Usług do wygenerowania nowego kontekstu zgodnie z wymaganiami? – mattdwen

+0

Powiedzmy, że "YourEntity" ma powiązany obiekt "Users", nie są odświeżane za pomocą MegeOption.OverwriteChanges, żadnej sugestii, jak odświeżyć YourEntity.Users również? –

Powiązane problemy