Muy bajo rendimiento para la inserción por lotes con SQL Server CE 4.0 y Entity Framework 4.2
Estoy insertando muchos datos en SQL Server CE 4.0 usando Entity Framework 4.2 (código primero), y el rendimiento es abismal en comparación con la inserción directa de SQL.
El modelo es muy simple:
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; }
}
Tengo 2623DocMembers
y un total de 7747DocItems
para insertar, y obtengo los siguientes tiempos de ejecución:
With SQL: 00:00:02.8
With EF: 00:03:02.2
Puedo entender que hay un poco de sobrecarga con EF, pero es 65 veces más lento que SQL!
Quizás haya un problema en mi código, pero es bastante sencillo y no puedo ver qué podría estar mal:
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;
}
}
También intenté llamar aSaveChanges
para cada elemento insertado, o cada 100 o 200 elementos, en vano (en realidad lo empeora).
¿Hay alguna forma de mejorar el rendimiento o tengo que usar SQL para las inserciones por lotes?
EDITAR para completar, aquí está el código para la inserción de SQL:http: //pastebin.com/aeaC1Kc