【问题标题】:Entity Framework Core 1.0 - How to seed a large amount of dataEntity Framework Core 1.0 - 如何播种大量数据
【发布时间】: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 的实例

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

  1. 插入所有记录需要30多分钟
  2. 我不能使用像System.Data.SqlClient.SqlBulkCopy 这样的东西,因为这个类在核心框架中不存在。还有其他选择吗?
  3. 根据日志,实体框架似乎将 INSERT SQL 语句拆分为 1999 值的块。它似乎也关闭了插入之间的数据库连接。我想这一切都是由 Entity 以最有效的方式管理的..
  4. 我找不到任何有关播种数据库的最佳实践的示例。我是否应该在应用程序启动时使用类似于我的方法和代码种子的方法(假设我找到了一种更快的插入方法)?还是应该使用某种执行 SQL 脚本的迁移?

任何关于如何使用 ASP.NET Core 框架 dnxcore50 播种大量数据的示例将不胜感激!

【问题讨论】:

  • 你检查过这个操作的瓶颈是什么吗?您是否进行了任何分析?我不会责怪数据库。插入数十万条记录通常不会超过 2-5 分钟(假设表没有 1k 列 =])
  • 实体框架 ORM 是瓶颈,而不是数据库本身。不建议将实体用于大型插入。这就是为什么我需要一些替代品

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


【解决方案1】:

相信你对 System.Data.SqlClient.SqlBulkCopy 的理解有误:

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

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

【讨论】:

  • 我有一个dotnet5.4类库项目。 SqlBulkCopy 目前不存在。我看到它是 corefx 的一部分,但这是否意味着它已可用于 dotnet5.4?如果是这样,我在System.Data.SqlClient 下看不到SqlBulkCopy,我做错了什么?
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 2017-12-22
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2018-12-04
相关资源
最近更新 更多