2011-10-05 22 views
7

Possiedo un sito che gestisce una raccolta di regole e un'applicazione di modulo Windows separata che apporta modifiche a livello di file in base alle regole nel database.Come forzare prima il codice EF per interrogare il database?

Entrambe queste applicazioni utilizzano le stesse librerie per un codice EF prima DbContext, ma ogni applicazione crea un'istanza della propria copia del contesto.

Il problema è che ogni versione del contesto in esecuzione non è al corrente delle modifiche apportate dall'altra versione. Per esempio. Se cambio una regola sul sito, l'app moduli ha ancora la versione precedente.

Sono consapevole che probabilmente sto andando in questo modo sbagliato, e dovrei avere qualche tipo di accesso ai dati tramite JSON/REST dal sito all'app moduli, ma preferirei non farlo per altri motivi.

C'è un modo per "disabilitare il caching" nel contesto e forzare ogni query a colpire il DB?

risposta

10

No, non è possibile disattivare la memorizzazione nella cache. È necessario impostare manualmente ogni query per il recupero dei dati. Questa funzione non è disponibile con DbContext API => devi utilizzare l'API ObjectContext.

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

O semplice scenario: un uso migliore gestione del contesto, se possibile, e invece di esecuzione di query sulla stessa contesto noi una nuova.

Btw. l'idea di avere un servizio esposto in un'applicazione winform e di averla consumata dal sito web è sbagliata. Avresti bisogno di una terza applicazione di servizio (ospitata sul server web o come servizio Windows) e sia l'applicazione web che l'applicazione winform accederanno al database attraverso quella nuova applicazione. EF sarebbe solo nella nuova applicazione.

Edit:

Se l'applicazione WinForm non apportare modifiche ai dati caricati dalla banca dati è anche possibile utilizzare questo:

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

questo sarà disattivare il rilevamento delle modifiche interne di entità e dovrebbe anche forza EF per ricaricare l'entità ogni volta ma renderà le modifiche di salvataggio molto più difficili.

+0

Mi piace lo scenario più semplice :) Al momento ho il repository creato tramite DI attraverso il costruttore. Immagino che dovrò nuke e usare un localizzatore di servizi per generare un nuovo contesto come richiesto? – mattdwen

+0

Diciamo che "YourEntity" ha un'entità "Utenti" correlata, non sono aggiornati con MegeOption.OverwriteChanges, qualche suggerimento su come aggiornare YourEntity.Users anche? –

Problemi correlati