Comandi batch di DB in Entity Framework 4.0

Il mio progetto attuale richiede la sincronizzazione quotidiana con un sistema esterno. La sincronizzazione è basata su una struttura di file di importazione complessa che viene analizzata e elaborata con una logica aziendale estesa. A causa della logica aziendale, abbiamo deciso di farlo in codice .NET e riutilizzare le componenti BL esistenti invece di scrivere la stessa logica nelle stored procedure o nei servizi di integrazione.

Lo strato BL si trova in cima al livello di accesso ai dati EF 4.0. L’attuale implementazione processa il batch di importazione, riempie tutte le modifiche in ObjectContext ed esegue SaveChanges nella transazione. Quando controllo il profiler SQL, vedo che EF esegue ogni modifica dell’entity framework come singolo comando SQL (con il proprio round trip nel DB). Inoltre sembra che questi comandi siano eseguiti in modo completamente sequenziale. Così ho fino a 100.000 roundtrips al database per l’importazione iniziale e tra 10.000 – 50.000 roundtrip al database per la sincronizzazione quotidiana.

È ansible inserire in batch / aggiornare / cancellare comandi in qualche modo da EF stesso o da qualche provider / estensione?

No, non si può fare (sì, piango anche io).

EF non supporta le operazioni batch, LINQ-SQL ha avuto (ha) lo stesso problema.

Hai alcune opzioni:

  1. Procedura di archiviazione
  2. Classico ADO.NET o EntitySQL
  3. trigger

Sono andato con le opzioni 1 e 3 in passato.

Il problema con tutti e tre gli approcci è la perdita dell’astrazione EF, il grafico interno (concorrenza ottimistica) e il ritorno al mondo di SQL nativo.

Essere consapevoli di questo progetto: magiq.codeplex.com

Porta operazioni batch a linq-to-sql e stiamo lavorando nel supporto di EntityFramework ormai.

Saluti

Esistono alcune soluzioni alternative in SQL Server:

  • Gli inserimenti batch sono descritti nell’articolo Entity Framework Bulk Copy

  • Gli aggiornamenti batch (e le eliminazioni) sono descritti negli aggiornamenti Entità multiple con Entity Framework – Articolo Aggiornamenti EF Fetch .

Se sei interessato a Oracle, MySQL, POstgreSQL o SQLite, puoi utilizzare gli ultimi provider di dotConnect Devart. La funzionalità BatchUpdates è già integrata nel metodo SaveChanges nelle ultime versioni di questi provider.

Ecco un modo che ti permette di usare il tuo codice prima POCO ed è veloce. Spedire un inserto di massa da> 1 ora a ~ 5 secondi.

SqlBulkCopy per elenco generico (utile per Entity Framework e NHibernate) .

Basta condividere con te un progetto GitHub solo per quello, al momento, supporta l’inserimento / aggiornamento / eliminazione di massa per il server Sql in modo trasparente utilizzando SqlBulkCopy. https://github.com/MHanafy/EntityExtensions Ci sono anche altre chicche e, si spera, sarà esteso per fare di più in pista. Usarlo è semplice come

var insertsAndupdates = new List(); var deletes = new List(); context.BulkUpdate(insertsAndupdates, deletes); 

Spero che sia d’aiuto!