Entity Framework guarda de forma selectiva entidades rastreadas del contexto e inserta masivamente otras

bulkinsert c# entity-framework sqlbulkcopy

Pregunta

Soy bastante nuevo en Entity Framework. Me he encontrado con un escenario donde tengo mis entidades:

public class Company{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Project> Projects{ get; set; }
}

public class Project
{
    public int Id { get; set; }
    public List<ProjectRecord> ProjectRecords { get; set; }
    public DateTime ProjectDate { get; set; }
}

public class ProjectRecord
{
    public int Id { get; set; }
    public virtual Project Project{ get; set; }
    public string Status { get; set; }
}

Creo mi contexto, cargo el Empleador y luego paso el objeto del empleador a otra clase que agrega un Proyecto a la entidad de mi empleador, y luego cargo aproximadamente 300,000 registros de proyectos de un archivo y agrego esta lista de registros del proyecto al proyecto.

Entity Framework está rastreando todo esto, y aunque no es particularmente rápido, no es tan malo.

La parte lenta es cuando llamo a SaveChanges () en el contexto. Quería poder separar la lista de Registros del proyecto de mi contexto y guardar el Proyecto sin ellos, y luego usar la extensión de inserción masiva provista desde https://efbulkinsert.codeplex.com/ para insertar de forma masiva los ProjectRecords por separado. Sin embargo, no pude encontrar una manera de separar ProjectRecords.

Por lo tanto, traté de insertar masivamente toda la entidad del Proyecto:

        context.BulkInsert(context,
            context.ChangeTracker.Entries()
                .Where(x => x.State == EntityState.Added)
                .Select(x => x.Entity)
                .OfType<Project>()
                .ToList());

        context.SaveChanges();

Sin embargo, esto parece tardar mucho tiempo en no hacer nada a la base de datos. Por lo tanto, creo que lo estoy haciendo completamente mal.

No tengo el contexto disponible cuando agrego el Proyecto a la entidad del Empleador y no quiero que esté disponible si puedo evitarlo, ya que trato de mantenerlos separados.

¿Hay alguna forma de mejorar el rendimiento, usar la extensión de inserción masiva o la copia masiva de SQL desde donde estoy llamando a SaveChanges en mi contexto?

Cualquier ayuda es muy apreciada.

Respuesta aceptada

Una sugerencia sería no adjuntar los ProjectRecords al contexto, en primer lugar, al cargarlos si es posible. Podrías usar algo como un

Dictionary<Project, List<ProjectRecord>>

para retenerlos y para ayudar a recuperar el Project y configurar ProjectRecord.Project al guardar.



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é