Entity Framework Core 1.0 - Come seminare una grande quantità di dati

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

Domanda

Sto usando un'applicazione ASP.NET Core 1.0 (precedentemente nota come ASP.NET 5) con il core framework e Entity Framework Core 1.0 (precedentemente noto come Entity Framework 7).

In questo blog https://blogs.msdn.microsoft.com/dotnet/2015/11/18/entity-framework-7-rc1-available le persone incaricate dello sviluppo di EF Core 1.0 dicono che non è raccomandato l'uso un'entità ORM simile per l'inserimento di massa di una grande quantità di dati e raccomandano un approccio di livello inferiore come SqlBulkCopy per farlo utilizzando direttamente il provider del database e ignorando Entity Framework.

Ho 120.000 record che ho bisogno di seminare. Al momento sto usando qualcosa del genere:

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

e sto chiamando il EnsureSeedData(path) dal mio Startup.cs dove ho un'istanza di MyDbContextSeedData

Le mie scoperte e domande con questo approccio:

  1. Occorrono più di 30 minuti per inserire tutti i record
  2. Non riesco a utilizzare qualcosa come System.Data.SqlClient.SqlBulkCopy perché questa classe non esiste nel framework principale. Qualche alternativa?
  3. Entity Framework, dietro le quinte e in base ai log, sembra dividere gli statemi SQL INSERT in blocchi di valori del 1999. Sembra anche chiudere la connessione DB tra gli inserimenti. Immagino che tutto questo sia gestito nel modo più efficiente da Entity comunque ..
  4. Non ho trovato alcun esempio sulle migliori pratiche per seminare un database. Dovrei usare qualcosa di simile al mio approccio e seed dal codice all'avvio dell'applicazione (supponendo che trovo un modo più veloce per fare gli inserti)? O dovrei usare qualche tipo di migrazione che esegue uno script SQL?

Qualsiasi esempio su come seminare grandi quantità di dati utilizzando il framework Dnxcore50 di ASP.NET Core sarebbe apprezzato!

Risposta popolare

Credo che ti sia sbagliato su System.Data.SqlClient.SqlBulkCopy:

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

Esegui come consigliano, assegna il framework dell'entità (di qualsiasi stripe) e utilizza la copia bulk di sql se questa sarà un'attività in corso. D'altra parte, si dice "seme" - se questa è una cosa una volta, basta farlo direttamente nel database, e quindi ripristinare dal backup per le situazioni future "start from zero".




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché