【发布时间】:2016-04-19 17:07:41
【问题描述】:
我想使用实体框架从 csv 文件批量插入 MS SQL Server 数据库。有没有使用实体框架进行批量插入的内置方法?
谢谢
【问题讨论】:
标签: entity-framework-6 bulkinsert ef-bulkinsert
我想使用实体框架从 csv 文件批量插入 MS SQL Server 数据库。有没有使用实体框架进行批量插入的内置方法?
谢谢
【问题讨论】:
标签: entity-framework-6 bulkinsert ef-bulkinsert
Entity 框架不支持批量插入。
如果您尝试添加数千个对象,只需将它们添加到DbSet,然后调用SaveChanges,您的性能就会显着下降。
using(var db = new Db())
{
foreach(var item from data)
{
db.Items.Add(item);
}
db.SaveChanges();
}
这是因为 EF 跟踪所有每个对象的变化,导致内存使用量大、计算量大。
根据您使用的 EF 版本和方法,您可以禁用跟踪更改,通过 100 或 1000 个项目的相对较小的部分插入对象,具体取决于它们的大小和您的情况的实际性能。然后计算一次变化并保存。例如。
int count = 100;
using (var db = new BloggingContext())
{
data.Configuration.AutoDetectChangesEnabled = false;
foreach (var item in data)
{
db.Items.Add(item);
--count;
if(count <= 0)
{
count = 100;
db.SaveChanges();
}
}
db.SaveChanges(); // To make sure we save everything if the last part was smaller than 100
}
也有少数库支持批量插入。例如:https://github.com/loresoft/EntityFramework.Extended
【讨论】:
正如 Yaroslav 所说,Entity Framework 团队没有直接支持 Bulk Insert,
但是有 3 个库支持它:
这里可以找到关于三个库的小文章:Entity Framework - Bulk Insert
例子:
using (var ctx = new EntitiesContext())
{
// Do not use the ChangeTracker or require to add the list in the DbSet
ctx.BulkInsert(list);
}
免责声明:我是项目的所有者Entity Framework Extensions
【讨论】: