I'm inserting a lot of data into SQL Server CE 4.0 using Entity Framework 4.2 (code-first), and the performance is abysmal when compared to direct SQL insertion.
The model is very 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; }
}
I have 2623 DocMembers
and a total of of 7747 DocItems
to insert, and I'm getting the following execution times:
With SQL: 00:00:02.8
With EF: 00:03:02.2
I can understand there's a bit of overhead with EF, but it is 65 times slower than SQL!
Perhaps there's a problem in my code, but it is quite straightforward and I can't see what could be wrong:
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;
}
}
I also tried to call SaveChanges
for each inserted item, or every 100 or 200 items, to no avail (it actually makes it worse).
Is there a way to improve the performance, or do I have to use SQL for batch inserts?
EDIT: for completeness, here's the code for the SQL insertion: http://pastebin.com/aeaC1KcB