实体框架核心1.0 - 如何播种大量数据

时间:2016-02-05 00:15:03

标签: asp.net-core sqlbulkcopy entity-framework-core seeding

我使用的是带有核心框架和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的实例

我对这种方法的发现和问题:

  1. 插入所有记录需要30多分钟
  2. 我不能使用像System.Data.SqlClient.SqlBulkCopy这样的东西,因为这个类在核心框架中不存在。还有其他选择吗?
  3. 实体框架,在幕后并根据日志,似乎将INSERT SQL statemens拆分为1999年的值。它似乎也关闭了插入之间的数据库连接。我想无论如何这都是以实体最有效的方式进行管理..
  4. 我找不到关于种子数据库的最佳做法的任何示例。我应该在应用程序启动时使用与我的方法类似的东西并从代码中播种(假设我找到了更快的方法来执行插入操作)?或者我应该使用某种执行SQL脚本的迁移?
  5. 有关如何使用ASP.NET Core框架 dnxcore50 播种大量数据的任何示例都将不胜感激!

1 个答案:

答案 0 :(得分:1)

我相信你错了System.Data.SqlClient.SqlBulkCopy:

https://github.com/dotnet/corefx/blob/master/src/System.Data.SqlClient/src/System/Data/SqlClient/SqlBulkCopy.cs

按照他们的建议,抛弃实体框架(任何条带)并使用sql批量复制,如果这将是一个正在进行的任务。另一方面,你说“种子” - 如果这是一次性的事情,只需在数据库中直接进行,然后从备份恢复以备将来“从头开始”的情况。