2013-07-29 9 views
12

Sto cercando di utilizzare dapper-dot-net per accelerare alcune aree della mia applicazione asp.net mvc. Sto anche utilizzando il codice EF5.Posso usare dapper-dot-net con Entity Framework?

Dal dapper-dot-net è solo alcune estensioni per IDbConnection, posso solo usare

DbContext.Database.Connection 

da usare dapper-dot-net? Io prova che funziona. Tuttavia, non sono sicuro che questo sia il modo giusto per usarlo? Soprattutto, quando utilizzo in questo modo, Entity Framework avrà ancora un impatto che potrebbe danneggiare le prestazioni?

risposta

6

Sì, è possibile utilizzarlo in questo modo. Dato che Dapper sta solo lavorando sui metodi di estensione, puoi utilizzarlo per le aree sensibili del rendimento del tuo codice. E puoi continuare a usare EF per altre aree del tuo codice. Le query che stai ancora utilizzando EF non saranno altrettanto veloci, ma almeno le query che utilizzano Dapper saranno più veloci.

+0

Sulla base dell'esperienza difficile, per "più veloce" intendiamo "due o tre ordini di grandezza più veloci". Avevo una query altamente ottimizzata in Entity Framework che impiegava 10 minuti, dopo la conversione in Dapper, ci volle una frazione di secondo per completare una query 20 volte la dimensione e la complessità: http://stackoverflow.com/questions/9350467/how- do-i-write-uno-a-molti-query-in-dapper-net/30080951 # 30080951. – Contango

+0

@Contango è stato quello con EF di AsNoTracking? –

+0

@Ian Warburton Non sono sicuro - ma a prescindere, la performance di Dapper lascia Entity Framework nella polvere. Dapper è principalmente orientato alla lettura dei dati, quindi se si vuole scrivere in un database, suppongo che Entity Framework funzioni se si è soddisfatti di prestazioni inefficienti e mediocri che possono supportare forse 10 utenti simultanei. – Contango

11

L'utilizzo di Dapper potrebbe rappresentare un significativo miglioramento delle prestazioni in determinati scenari.

È possibile condividere la connessione EF con Dapper. Tuttavia (sebbene sia improbabile che si tratti di un problema) è necessario prestare attenzione ai problemi di concorrenza (ad esempio a causa di tentativi di associazione di più lettori di dati con la stessa connessione).

Se si riscontrano tali problemi, è possibile fornire una nuova connessione a Dapper utilizzando la stringa di connessione (DbContext.Database.Connection.ConnectionString), anziché condividere la connessione.

+2

Mentre * true *, è improbabile che questo sia un problema nella maggior parte degli scenari - il threading * certamente * è improbabile che sia un fattore, quindi lascia principalmente il rischio che esista un open data-reader - che è piuttosto facile da individuare (l'errore non è molto sottile) –

+4

@MarcGravell Prenderò la tua parola per questo :) Ma non è solo più sicuro dare sempre a Dapper la propria connessione (invece di usare quella EF)? O c'è uno svantaggio nel farlo? –