asp.net-core - Entity Framework Core 1.0 - 如何播种大量数据

标签 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)来执行此操作直接使用数据库提供程序并跳过 Entity Framework 。

我有 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. Entity Framework 在幕后并根据日志,似乎将 INSERT SQL 语句拆分为 1999 值的 block 。它还似乎关闭了插入之间的数据库连接。我猜这一切都由 Entity 以最有效的方式管理。
  4. 我找不到任何关于为数据库播种的最佳实践的示例。我是否应该在应用程序启动时使用与我的方法类似的方法并从代码中获取种子(假设我找到了一种更快的插入方法)?还是我应该使用某种执行 SQL 脚本的迁移?

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

最佳答案

我相信您对 System.Data.SqlClient.SqlBulkCopy 有误:

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

按照他们的建议去做,放弃 Entity Framework (无论什么 strip ),如果这将是一项持续的任务,则使用 sql 批量复制。另一方面,你说“种子”——如果这是一次性的事情,直接在数据库中做,然后从备份中恢复以备将来“从头开始”的情况。

关于asp.net-core - Entity Framework Core 1.0 - 如何播种大量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35214159/

相关文章:

asp.net-core - Okta 使用 OpenID Connect 配置中的公钥验证 JWT token

c# - 具有列映射的 MySqlBulkLoader?

c# - 如何使用 SqlBulkCopyColumnMappingCollection?

c# - 如何在 EF Core 3.1 中以异步方式使用 GroupBy?

.net - 使用 Entity Framework Core 的分片策略

c# - ASP.NET Core - 单例注入(inject)时存储库依赖项注入(inject)失败

c# - 在 asp.net 核心应用程序中配置 log4net AdoNetAppender

c# - 如何测量每个 Web 请求的 Azure CosmosDB 请求单位?

c# - 使用 log4net 批量记录到 SQL Server

c# - EF Core RC2 中的迁移