【发布时间】:2016-05-14 20:10:19
【问题描述】:
我正在使用带有核心框架和 Entity Framework Core 1.0(以前称为 Entity Framework 7)的 ASP.NET Core 1.0(以前称为 ASP.NET 5)应用程序。
在这篇博客https://blogs.msdn.microsoft.com/dotnet/2015/11/18/entity-framework-7-rc1-available EF Core 1.0 的开发负责人说不建议使用类似 ORM 的实体来批量插入大量数据,他们建议使用使用 SqlBulkCopy 等较低级别的方法直接使用数据库提供程序并跳过实体框架。
我有 120,000 条记录需要播种。目前我正在使用这样的东西:
private readonly MyDbContext _context;
public MyDbContextSeedData(MyDbContext context)
{
_context = context;
}
public void EnsureSeedData(string seedPortsFilePath)
{
SeedPorts(seedPortsFile);
}
private void SeedPorts(string seedPortsFilePath)
{
if (!_context.Ports.Any())
{
var ports = PortsData.GetPorts(seedPortsFile);
List<Port> listPorts = ports.ToList();
// the following statement commented out did not make any improvement
// _context.ChangeTracker.QueryTrackingBehavior = Microsoft.Data.Entity.QueryTrackingBehavior.NoTracking
_context.AddRange(portsRange);
_context.SaveChanges();
}
}
我从我的 Startup.cs 调用 EnsureSeedData(path),其中我有一个 MyDbContextSeedData 的实例
我对这种方法的发现和问题:
- 插入所有记录需要30多分钟
- 我不能使用像
System.Data.SqlClient.SqlBulkCopy这样的东西,因为这个类在核心框架中不存在。还有其他选择吗? - 根据日志,实体框架似乎将 INSERT SQL 语句拆分为 1999 值的块。它似乎也关闭了插入之间的数据库连接。我想这一切都是由 Entity 以最有效的方式管理的..
- 我找不到任何有关播种数据库的最佳实践的示例。我是否应该在应用程序启动时使用类似于我的方法和代码种子的方法(假设我找到了一种更快的插入方法)?还是应该使用某种执行 SQL 脚本的迁移?
任何关于如何使用 ASP.NET Core 框架 dnxcore50 播种大量数据的示例将不胜感激!
【问题讨论】:
-
你检查过这个操作的瓶颈是什么吗?您是否进行了任何分析?我不会责怪数据库。插入数十万条记录通常不会超过 2-5 分钟(假设表没有 1k 列 =])
-
实体框架 ORM 是瓶颈,而不是数据库本身。不建议将实体用于大型插入。这就是为什么我需要一些替代品
标签: asp.net-core sqlbulkcopy entity-framework-core seeding