24 messaggi dal 16 giugno 2008
Ciao a tutti.
Volevo fare una domanda riguardo l'uso del repository pattern con EF 4. L'utilizzo della proprietà Local del DbSet è molto utile soprattutto se bindata alla DataSource di una DataGridView. Utilizzando però il repository pattern non riesco a capire come potrei esporla.
E' possibile farlo, visto che i metodi dei miei repository ritornano degli IQueryable, o devo rinunciare?
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?

Grazie
Modificato da amathos il 05 novembre 2012 14.28 -
11.886 messaggi dal 09 febbraio 2002
Contributi
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-DbConte
Comunque, 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 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.