エンティティフレームワークコア1.0 - 大量のデータをシードする方法

asp.net-core entity-framework-core seeding sqlbulkcopy

質問

私は、コアフレームワークとEntity Framework Core 1.0(以前はEntity Framework 7として知られていました)を備えたASP.NET Core 1.0(以前はASP.NET 5として知られていました)アプリケーションを使用しています。

このブログでは、EF Core 1.0の開発担当者がhttps://blogs.msdn.microsoft.com/dotnet/2015/11/18/entity-framework-7-rc1-available を使用して、大量のデータを大量に挿入するためのORMのようなエンティティであり 、SqlBulkCopyなどの低レベルのアプローチを推奨し、データベースプロバイダを直接使用し、Entity Frameworkをスキップします。

私は、私が種まきする必要がある12万レコードを持っています。現時点で私はこのようなものを使用しています:

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();
    }
}

そして、私は呼び出していますEnsureSeedData(path)私が持っているのインスタンス私Startup.csからMyDbContextSeedData

このアプローチによる私の発見と疑問:

  1. すべてのレコードを挿入するのに30分以上かかります
  2. このクラスはコアフレームワークには存在しないため、 System.Data.SqlClient.SqlBulkCopyようなものは使用できません。代わりに?
  3. Entity Frameworkは、舞台裏で、そしてログに基づいて、INSERT SQLステートメントを1999年の値の塊で分割しているようです。また、挿入間のDB接続を閉じるようです。私はこれがEntityによって最も効率的なやり方で管理されていると思います。
  4. データベースをシードするベストプラクティスの例は見つかりませんでした。アプリケーションの起動時に、コードからアプローチとシードを似たものを使うべきでしょうか(私が挿入を行うより速い方法を見つけたと仮定して)?または、SQLスクリプトを実行する何らかの移行を使用する必要がありますか?

ASP.NETコアフレームワークdnxcore50を使用して大量のデータをシードする方法の例をお聞かせください

人気のある回答

私はあなたがSystem.Data.SqlClient.SqlBulkCopyについて間違っていると信じています:

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

彼らが推奨しているように、エンティティ・フレームワーク(ストライプが何であれ)を破棄し、これが進行中のタスクになる場合はSQLのバルク・コピーを使用します。一方、「シード」と言えば、これは一度だけのことであれば、データベースでそのまま実行してから、将来の「最初から開始する」ためにバックアップから復元してください。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ