使用SQL Server CE 4.0和Entity Framework 4.2的批量插入的性能非常差

Tho*_*que 8 .net performance entity-framework sql-server-ce-4

我使用Entity Framework 4.2(代码优先)将大量数据插入到SQL Server CE 4.0中,与直接SQL插入相比,性能极差.

该模型非常简单:

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; }
}
Run Code Online (Sandbox Code Playgroud)

我有2623 DocMembers和总共7747 DocItems要插入,我得到以下执行时间:

With SQL: 00:00:02.8
With EF:  00:03:02.2
Run Code Online (Sandbox Code Playgroud)

我可以理解EF有一些开销,但它比SQL慢65倍!

也许我的代码中存在问题,但它非常简单,我看不出有什么问题:

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我也尝试呼叫SaveChanges每个插入的项目,或每100或200项,无济于事(它实际上使情况更糟).

有没有办法提高性能,还是我必须使用SQL进行批量插入?


编辑:为了完整性,这里是SQL插入的代码:http://pastebin.com/aeaC1KcB

Eri*_*kEJ 6

您可以使用我的SqlCeBulkCopy库来加载批量数据,它模仿SqlBulkCopy api:http://sqlcebulkcopy.codeplex.com