在实体框架中将批量数据插入/更新到sql表

时间:2016-06-10 13:41:52

标签: entity-framework-6 bulkinsert bulkupdate

我有一个产品表,包括产品编号,价格和货币。 我通过excel文件上传数据与数据。 当我上传数据然后我在后端创建一个列表,其中包含来自excel的所有数据,然后将整个列表发送到服务器以更新/插入表中的数据。

               foreach(Product value in item)
                {
                    Product p = context.Product.SingleOrDefault(p => p.ProductNumber == value.ProductNumber && p.CurrencyId == value.CurrencyId);
                    if (p!= null)
                    {

                        context.Entry<Product>(p).Property(p => p.ProductPrice).IsModified = true;
                        p.ProductPrice = value.ProductPrice ;

                        context.SaveChanges();
                    }
                    else
                    {

                        context.Product.Add(value);
                        context.SaveChanges();
                    }
                }

但随着数据的增加(产品增加),上传需要花费大量时间。 有什么建议可以优化吗?我想的一件事是关于产品编号和货币栏的索引。

1 个答案:

答案 0 :(得分:0)

性能问题不是由于索引引起的(当然,如果不存在索引,这也会有帮助)但是由于您的代码正在执行的数据库往返次数。

对于每件产品:

  • 检查产品是否存在(1个数据库往返)
  • 您插入/更新产品(1个数据库往返)

因此,如果您从excel文件上传10,000个产品,您将执行20,000次数据库往返,这是疯狂的。

有一些技巧可能有助于提高性能,例如添加多个产品以使用AddRange而不是Add来插入,但最终会出现由数据库往返次数引起的相同性能问题。

免责声明:我是该项目的所有者Entity Framework Extensions

此库允许通过执行以下操作来显着提高性能:

  • BulkSaveChanges
  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

示例:

// Insert or Update using ProductNumber && CurrencyId as the Key
ctx.BulkMerge(list, operation =>
{
    operation.ColumnPrimaryKeyExpression = x => new {x.ProductNumber, x.CurrencyId};
});