33 messaggi dal 15 marzo 2011
Salve, sto sviluppando una solution in VS2010 costruendo il db con le classi POCO (a manella, senza template) sotto EF 4.3.

L'alberatuta e' composta da circa 600 tabelle collegate tra loro tramite chiavi.

Ora, vado a fare il primo nuovo inserimento con qcosa tipo:

using (ReportContext ctx = new ReportContext())
{
ctx.Report.Add(this);
ctx.SaveChanges();
}

dove nella classe ReportContext() faccio solo 1 volta il controllo se il modello e' compatibile, inoltre c'e' il metodo OnModelCreating con il Mapping di tutte le classi.

Quello che succede e' che il primo inserimento e' lentiiiiissimo, in particolare il SaveChanges, e talvolta mi va in Thread was being aborted.

Da cosa dipende e soprattutto cosa posso fare per velocizzare?
Grazie mille
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
i motivi della lentezza che stai sperimentando sono descritti in questo articolo di Stefano Mostarda. Lì puoi leggere anche di alcune tecniche per migliorare le performance.
http://www.linqitalia.com/articoli/entity-framework/migliorare-performance-accesso-dati-entity-framework-41-p-2.aspx

nero.mancini ha scritto:

L'alberatuta e' composta da circa 600 tabelle

A prescindere dalle ottimizzazioni che puoi mettere in atto, queste tabelle sono troppe. Un modello di questa portata va assolutamente suddiviso in contesti più piccoli, affinché sia più gestibile.

Se la tua applicazione si occupa di produrre della reportistica, allora potrebbe anche essere opportuno creare una copia denormalizzata del database, che si adatta meglio a questo scopo. Ti ritroverai con molte tabelle in meno e vedrai che le pretazioni saranno migliori.

ciao
Modificato da BrightSoul il 30 ottobre 2012 21.26 -

Enjoy learning and just keep making
33 messaggi dal 15 marzo 2011
Ciao e intanto grazie per la risposta.

sissi, infatti gia' ho cominciato a suddividere in sotto-contesti.

Per quanto riguarda l'articolo per performizzare, gia' avevo disabilitato il tracking e tolto il proxy ma non ho ottenuto ahime' risultati apprezzabili. Utilizzare codice sql vorrei evitarlo, mi sembrerebbe un tornare indietro.

Per quanto riguarda la denormalizzazione purtroppo le classi/tabelle mi sono praticamente imposte dal fornitore..

Avevo invece sentito di un "sostanzioso" passo avanti con l'utilizzo del Entity Framework 5: risulta anche a te?

Dico questo perche' io ho VS2010 mentre lo EF5 va solo su VS2012 e non e' che posso fare questo "saltino" solo per un sentito dire.

Se sai - dati alla mano - che mi conviene ti pregherei di darmi ragguagli.
Tnx 1000
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

nero.mancini ha scritto:

Avevo invece sentito di un "sostanzioso" passo avanti con l'utilizzo del Entity Framework 5: risulta anche a te?

Sì, è vero. Ecco qui le considerazioni sulle performance di Entity Framework 5:
http://blogs.msdn.com/b/adonet/archive/2012/02/14/sneak-preview-entity-framework-5-0-performance-improvements.aspx
http://msdn.microsoft.com/en-us/data/hh949853.aspx

EF5 puoi usarlo anche da Visual Studio 20120, in un'applicazione che viene compilata per il framework 4. Così facendo, tuttavia, non puoi avvalerti di tutte le nuove funzionalità.
Leggi il paragrafo "Compatibility" di questo articolo.
http://blogs.msdn.com/b/adonet/archive/2012/05/15/ef5-release-candidate-available-on-nuget.aspx

Se il tuo progetto è appena agli inizi, ti conviene sin da subito passare a EF5. Così sei già pronto quando vorrai passare a Visual Studio 2012.

A prescindere dai miglioramenti di EF5, è importante che tu faccia delle ottimizzazioni soprattutto a livello architetturale perché sono queste che influiscono maggiormente sulle prestazioni dell'applicazione.

nero.mancini ha scritto:

ho cominciato a suddividere in sotto-contesti.

Benissimo! E se qualche entità dovesse essere condivisa tra più contesti, non aver paura di creane due versioni, mappando solo le proprietà di interesse in ciascun contesto.

nero.mancini ha scritto:

le classi/tabelle mi sono praticamente imposte dal fornitore..

Ok, come prima cosa verifica se l'aver creato contesti più piccoli è già sufficiente a produrre prestazioni accettabili.
Se ti rendi conto che, nonostante tutto, l'applicazione va a rilento perché c'è un'elevata concorrenzialità di richieste, allora forse è il caso di capire che rapporto esiste tra operazioni di lettura e scrittura. Se le prime sono di molto superiori alle seconde, allora hai un problema: il fornitore ti impone un modello che non si adatta perfettamente alla tua applicazione.
La soluzione esiste e rispetta le necessità di tutti: puoi scriverti un secondo modello da usare solo per le operazioni di lettura. Non devi modificare lo schema che ti è stato imposto dal fornitore (che resta quello di riferimento), ma crearne un secondo che tieni localmente e che venga periodicamente aggiornato da un denormalizzatore.

Per sapere se effettivamente ti serve tutto ciò, cerca fin da subito di mettere sotto stress l'applicazione per capire quale carico di richieste può sopportare. Puoi usare uno di questi tool.
In base ai risultati, potrai prendere le tue decisioni.

ciao
Modificato da BrightSoul il 31 ottobre 2012 10.55 -

Enjoy learning and just keep making
per i miglioramenti di performance su .net 4 puoi provare EF6 Alpha 1... ovviamente è un "Alpha" quindi usare con cautela

Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna.
-Albert Einstein-
33 messaggi dal 15 marzo 2011
Ciao, intanto grazie per l'aiuto e i suggerimenti.

Forse mi sfugge qcosa ma per poter usare lo EF5 devo installare il .NET Framework almeno 4.5 e quando provo a fare questa cosa "sbatto" contro il muro che il VS2010 supporta fino al .NET Framework 4 (in particolare il 4.0.3)
http://msdn.microsoft.com/en-US/hh487282.aspx
Spero di sbagliarmi, vedi anche tu se ti torna.

In ogni caso, gia' la de-contestualizzazione sta apportando notevoli miglioramenti.

Fichissimo lo Stress Tool !!!
Solo che non riesco a trovarlo, dal link mi rimanda a http://www.microsoft.com/en-us/download/default.aspx e poi si perdono le tracce.. riesci a trovare il download ?

Grazie ancora per tutte le dritte, ora inizio a studiarmele e poi vedo.
Modificato da nero.mancini il 01 novembre 2012 22.34 -
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

nero.mancini ha scritto:

"sbatto" contro il muro che il VS2010 supporta fino al .NET Framework 4

Esatto, l'applicazione continuerà ad essere compilata per il Framework 4 ma potrai comunque referenziare EF5 nella tua applicazione se lo scarichi con NuGet, un'estensione di Visual Studio per la gestione delle librerie.

Dunque, per prima cosa installa NuGet e poi apri la sua Console. Da lì lancia il comando:
Install-Package EntityFramework -Version 5.0.0

Ricorda che questa versione non ha tutte le funzionalità del "vero" EF5. Se passerai a Visual Studio 2012, probabilmente dovrai lanciare il comando:
Update-Package EntityFramework
Così da scaricare l'assembly idoneo al framework 4.5.

nero.mancini ha scritto:

dal link ... si perdono le tracce.

Già, i link sono saltati. Prova qui:
Wcat stress tool (versione 32 bit, versione 64 bit)

ciao
Modificato da BrightSoul il 02 novembre 2012 09.45 -

Enjoy learning and just keep making
33 messaggi dal 15 marzo 2011
Si ok ho gia' il NuGet a bordo, domanda: ma se scarico lo EF5 questo poi mi viene installato a livello di project, solution o cross tutto il VS2010 ?

WCAT trovato, tnx ;)
Sai mica dove e' un manuale o degli esempi ?
Modificato da nero.mancini il 02 novembre 2012 13.01 -

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.