2015-12-04 6 views
7

Creazione di un livello di accesso ai dati per un'applicazione MVC aziendale interna con Entity Framework e il modello di repository. In alcuni casi, ho bisogno di aggiornare, ad esempio, 100k righe in una tabella con 100 milioni di righe in un database di SQL Server 2008 R2.Can Entity Framework può generare un'istruzione UPDATE ... WHERE in SQL?

Sto utilizzando EF6, il targeting di un database legacy esistente è il refactoring. Sono nuovo in Entity Framework, ma ho molta esperienza con SQL Server.

Non importa quanto mi sembra di strutturare la mia dichiarazione di aggiornamento, quando eseguo un profiler, vedo 60k aggiornamenti individuali per ID. Questo può richiedere fino a 5 minuti per l'esecuzione. Tuttavia, ho detto un "numero di lotto" che è indicizzato per un gruppo di questi record. Esiste un modo per creare UPDATE questi record con una singola clausola where generata da EF? La mia soluzione è stata semplicemente scrivere un semplice sp che poi ho chiamato EF.

+1

EntityFramework non esegue operazioni batch. Ogni operazione sarà una operazione sul database per record (come hai scoperto) È possibile scrivere ed eseguire la propria istruzione SQL tramite EntityFramework o chiamare una stored procedure e passare i parametri appropriati tramite EntityFramework. – Tommy

+0

Nella mia esperienza vorrei andare con un SP per operazioni così 'grandi'. –

+1

Le attuali versioni di EF v6 non supportano le operazioni di batch-up, ma il team EF sta lavorando sodo su EF v7 e alla fine * supporterà le operazioni batch. Per ora - o hai bisogno di ricorrere alle tue soluzioni, o dare un'occhiata a soluzioni di terze parti come [EntityFramework.Extended] (https://github.com/loresoft/EntityFramework.Extended) –

risposta

4

Entity Framework nella sua versione attuale non supporta le operazioni di massa nel senso in cui lo si desidera. Ogni aggiornamento o eliminazione sarà una singola transazione per record. Per evitare questo, è possibile eseguire SQL direttamente da Entity Framework se non si vuole passare attraverso il fastidio di creare una stored procedure (anche se, sono abbastanza facili da alzarsi e andare)

using (var context = new MyDbContext()) 
{ 
    context.ExecuteStoreCommand("Update MyTable Set Value = {0} Where SomeColumn = {1}", 
           updateValue, queryValue); 
    context.ExecuteStoreCommand("Delete From MyTable Where value = {0}", 
           myValueToQueryBy); 
} 

Si noti l'uso del parametro utilizzando la sintassi che sembra molto simile a string.Format(). Si prega di consultare il MSDN per ulteriori informazioni.

+0

Grazie. Il mio istinto mi rende timido dal testo SQL nei miei file .cs, ma capisco il concetto. Fondamentalmente sto rendendo la nostra pratica in futuro quando usiamo il framework di entità per utilizzare sempre una procedura memorizzata quando si aggiornano più righe sulle note tabelle "grandi". Ho un modello di repository dati generico e, per "TableA", aggiungo un nuovo metodo per chiamare la stored procedure alla classe "TableARepository". – jkerak