ciao,
amathos ha scritto:
Utilizzando però il repository pattern non riesco a capire come potrei esporla.
Non devi. Il tracking delle entità (o la cache) sono dei dettagli implementativi del contesto che usi per accedere ai dati. Se hai scelto di usare il pattern repository è perché vuoi astrarre dal contesto e quindi non è detto che altre implementazioni del repository dispongano di quella funzionalità.
Comunque, mi aiuterebbe meglio a capire il problema se potessi dirmi a quale scopo usi la proprietà Local dei DbSet. Non è che per caso mantieni attivo il DbContext per più di un richiesta web? Allora quel che ti serve è una cache di secondo livello, che EF non supporta ma che puoi ottenere mettendo in pratica i suggerimenti di questo articolo.
http://www.codeproject.com/Articles/435142/Entity-Framework-Second-Level-Caching-with-DbConteComunque, assolutamente, il DbContext non va condiviso tra le richieste perché non è un oggetto thread-safe.
Se invece ti interessa semplicemente evitare più query al database all'interno della stessa richiesta web, allora puoi ottenere le entità dal repository e subito invocare il .ToList() sulla collezione per "congelarla" e riutilizzarla più volte.
amathos ha scritto:
Se non è possibile, come posso tenere sincronizzati in maniera quanto più automatica una datagridview ed i risultati provenienti dalle interrogazioni sul repository o gli inserimenti e le cancellazioni?
- Lettura: il problema si pone solo se usi una cache di secondo livello. Devi riuscire ad invalidarla quando si verificano aggiornamenti sul database. Non ho letto accuratamente l'articolo che ti ho postato quindi non so se gestisce già lui questa situazione. Se non lo fa, puoi far dipendere la cache da una SqlDependency.
- Scrittura: aggiungi una colonna alla tua tababella del DB e usala come campo di versione. Entity Framework supporta la concorrenza ottimistica, quindi questo è un buon modo per evitare che più utenti sovrappongano le loro modifiche. In questo articolo di Stefano Mostarda puoi vedere come designare un campo versione con EF code first.
http://www.linqitalia.com/script/262/Marcare-Proprieta-Concorrenza-Ottimistica-Entity-Framework-Code-First.aspx
ciao
Modificato da BrightSoul il 11 novembre 2012 17.53 -