我使用类似的循环(简化,没有错误检查)从在线数据填充我的数据库:
foreach (var catalog in catalogs)
{
var result = Items(catalog, state, context);
while (result != null)
{
result.ForEach(r => context.DbContext.Items.Add(r));
context.DbContext.SaveChanges();
result = Items(catalog, state, context);
}
}
代码需要一些时间从服务器获取XML响应并使用响应流上的XElement.Load将其解码为XElement。它被解码为包含最多50个项目的项目列表 - 这是我在每个循环传递中从服务器请求的内容。由于SaveChanges调用,该块会立即保存到表中。
循环时间的8/10花费在向DbContext或SaveChanges调用中添加项目或两者上。与远程服务器通信并将响应XML解码为实体列表是2/10。
如何在保持EF的同时提高将数据存储到数据库的效率?
我知道我可以从XML批量加载数据库,但这会迫使我弄清楚我需要编写的SQL语句,因为几个相关的表通过上面的SaveChanges调用得到更新,所以我开始失败使用EF的优点。
答案 0 :(得分:2)
简而言之:您无法使用纯EF加快插入过程,因为EF有very poor performance for bulk / batch data processing。你有两个问题:
SavaChanges
后尝试拨打Add
,或者甚至尝试为每个批次使用新的上下文,甚至每次拨打Add
。SaveChanges
的频率无关。只有在使用直接SQL并创建一次执行所有插入的单SqlCommand
时,才能避免这种情况。如果要提高性能,请使用直接SQL。