Inserisco molti dati in SQL Server CE 4.0 utilizzando Entity Framework 4.2 (code-first) e le prestazioni sono pessime rispetto a quelle dirette Inserimento SQL.Prestazioni molto scarse per l'inserimento batch con SQL Server CE 4.0 e Entity Framework 4.2
Il modello è molto semplice:
public class DocMember
{
public DocMember() { this.Items = new List<DocItem>(); }
public int Id { get; set; }
public string Name { get; set; }
public string MemberType { get; set; }
public string AssemblyName { get; set; }
public virtual IList<DocItem> Items { get; set; }
}
public class DocItem
{
public int Id { get; set; }
public DocMember Member { get; set; }
public string PartType { get; set; }
public string PartName { get; set; }
public string Text { get; set; }
}
devo 2.623 DocMembers
e un totale di 7747 di DocItems
per inserire, e sto ottenendo i seguenti tempi di esecuzione:
With SQL: 00:00:02.8
With EF: 00:03:02.2
posso capisco che c'è un po 'di overhead con EF, ma è 65 volte più lento di SQL!
Forse c'è un problema nel mio codice, ma è abbastanza semplice e non riesco a vedere quello che potrebbe essere sbagliato:
private TimeSpan ImportMembersEF(IList<DocMember> members)
{
using (var db = new DocEntities())
{
db.Database.CreateIfNotExists();
var sw = Stopwatch.StartNew();
foreach (var m in members)
{
db.Members.Add(m);
}
db.SaveChanges();
sw.Stop();
return sw.Elapsed;
}
}
Ho anche provato a chiamare SaveChanges
per ogni elemento inserito, oppure ogni 100 o 200 articoli, senza alcun risultato (in realtà lo rende peggiore).
C'è un modo per migliorare le prestazioni o devo usare SQL per gli inserimenti batch?
EDIT: per completezza, ecco il codice per l'inserimento SQL: http://pastebin.com/aeaC1KcB
Sono l'auto 'Id's generato sul server? – Eranga
Non ho idea se questo abbia qualcosa a che fare con la prestazione lenta, ma mi chiedo se, secondo la convenzione, 'DocMemeber Member pubblico {get; impostato; } 'dovrebbe essere' public DocMember DocMember {get; impostato; } 'e anche se ci dovrebbe essere un membro' public int DocMember DocMemberId {get; impostato; } '. – devuxer
@Eranga, si. Non ho specificato nulla al riguardo, è il comportamento predefinito. –