Entity Framework consente di salvare selettivamente le entità tracciate dal contesto e inserire in serie gli altri

bulkinsert c# entity-framework sqlbulkcopy

Domanda

Sono abbastanza nuovo per Entity Framework. Mi sono imbattuto in uno scenario in cui ho le mie entità:

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 il mio contesto, carico il Datore di lavoro quindi trasferisco l'oggetto datore di lavoro in un'altra classe che aggiunge un Progetto alla mia entità datore di lavoro, quindi carico circa 300.000 record di progetto da un file e aggiungo questo elenco di record di progetto al progetto.

Entity Framework sta monitorando tutto questo e, sebbene non sia particolarmente veloce, non è male.

La parte lenta è quando chiamo SaveChanges () sul contesto. Volevo essere in grado di separare l'elenco dei record del progetto dal mio contesto e salvare il progetto senza di essi, quindi utilizzare l'estensione di inserimento di massa fornita da https://efbulkinsert.codeplex.com/ per inserire in blocco separatamente ProjectRecords. Tuttavia non sono riuscito a trovare un modo per staccare ProjectRecords.

Ho quindi provato a inserire in massa l'intera entità del progetto:

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

        context.SaveChanges();

Tuttavia, questo sembra richiedere molto tempo per non fare nulla al database. Penso quindi che mi sto sbagliando completamente.

Non ho il contesto disponibile quando aggiungo il progetto all'entità Datore di lavoro e non voglio renderlo disponibile se posso evitarlo, poiché sto cercando di tenerli separati.

C'è un modo per migliorare le prestazioni, utilizzare l'estensione di inserimento di massa o la copia di massa di SQL da dove sto chiamando SaveChanges sul mio contesto?

Qualsiasi aiuto è molto apprezzato.

Risposta accettata

Un suggerimento sarebbe quello di non collegare i ProjectRecords al contesto in primo luogo quando li carica da se è possibile. Potresti usare qualcosa come a

Dictionary<Project, List<ProjectRecord>>

per tenerli e per aiutare a recuperare il Project e impostare ProjectRecord.Project quando si salva.



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é