Entity Framework Core 1.0 - Cómo sembrar una gran cantidad de datos

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

Pregunta

Estoy utilizando una aplicación ASP.NET Core 1.0 (anteriormente conocida como ASP.NET 5) con Core Framework y Entity Framework Core 1.0 (anteriormente conocida como Entity Framework 7).

En este blog https://blogs.msdn.microsoft.com/dotnet/2015/11/18/entity-framework-7-rc1-available las personas a cargo del desarrollo de EF Core 1.0 dicen que no se recomienda su uso una entidad similar a ORM para la inserción masiva de una gran cantidad de datos y recomiendan un enfoque de nivel inferior como SqlBulkCopy para hacerlo usando el proveedor de la base de datos directamente y omitiendo Entity Framework.

Tengo 120,000 registros que necesito para sembrar. En este momento estoy usando algo como esto:

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

y estoy llamando a la dirección de EnsureSeedData(path) desde mi Startup.cs donde tengo una instancia de MyDbContextSeedData

Mis hallazgos y preguntas con este enfoque:

  1. Se necesitan más de 30 minutos para insertar todos los registros.
  2. No puedo usar algo como System.Data.SqlClient.SqlBulkCopy porque esta clase no existe en el marco central. ¿Alguna alternativa?
  3. Entity Framework, detrás de escena y de acuerdo con los registros, parece estar dividiendo los estados INSERT SQL en fragmentos de valores de 1999. También parece cerrar la conexión DB entre inserciones. Supongo que todo esto es manejado de la manera más eficiente por la Entidad de todos modos.
  4. No pude encontrar ningún ejemplo sobre las mejores prácticas para sembrar una base de datos. ¿Debo usar algo similar a mi enfoque y inicializar desde el código cuando se inicie la aplicación (suponiendo que encuentre una forma más rápida de hacer las inserciones)? ¿O debería usar algún tipo de migración que ejecute un script SQL?

¡Cualquier ejemplo sobre cómo sembrar grandes cantidades de datos utilizando el marco Core de ASP.NET dnxcore50 sería apreciado!

Respuesta popular

Creo que estás equivocado acerca de System.Data.SqlClient.SqlBulkCopy:

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

Haga lo que recomiendan, elimine el marco de la entidad (de cualquier franja) y use la copia masiva de SQL si va a ser una tarea en curso. Por otro lado, usted dice "semilla": si esto es algo de una sola vez, simplemente hágalo directamente en la base de datos y luego restaure desde la copia de seguridad para futuras situaciones de "inicio desde cero".




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué