實體框架核心1.0 - 如何播種大量數據


我正在使用ASP.NET Core 1.0(以前稱為ASP.NET 5)應用程序與核心框架和Entity Framework Core 1.0(以前稱為Entity Framework 7)。

在這個博客https://blogs.msdn.microsoft.com/dotnet/2015/11/18/entity-framework-7-rc1-可用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. 實體框架,在幕後並根據日誌,似乎是在1999年的值塊中分割INSERT SQL狀態。它似乎也關閉了插入之間的數據庫連接。我想無論如何這都是以實體最有效的方式管理的。
  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

按照他們的建議,拋棄實體框架(任何條帶)並使用sql批量複製,如果這將是一個正在進行的任務。另一方面,你說“種子” - 如果這是一次性的事情,只需在數據庫中直接進行,然後從備份恢復以備將來“從頭開始”的情況。





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因