Entity Framework speichert selektiv verfolgte Entitäten vom Kontext und fügt andere ein

bulkinsert c# entity-framework sqlbulkcopy

Frage

Ich bin ziemlich neu in Entity Framework. Ich bin auf ein Szenario gestoßen, in dem ich meine Entitäten habe:

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

Ich erstelle meinen Kontext, lade den Arbeitgeber und übergebe dann das Arbeitgeberobjekt an eine andere Klasse, die meiner Arbeitgebereinheit ein Projekt hinzufügt, und lade dann ungefähr 300.000 Projektdatensätze aus einer Datei und füge diese Liste von Projektdatensätzen dem Projekt hinzu.

Entity Framework verfolgt all dies, und obwohl es nicht besonders schnell ist, ist es nicht so schlimm.

Der langsame Teil ist, wenn ich SaveChanges () für den Kontext aufrufen. Ich wollte in der Lage sein, die Liste der Projektdatensätze von meinem Kontext zu trennen und das Projekt ohne sie zu speichern, und dann die Bulk-Einfügeerweiterung, die von https://efbulkinsert.codeplex.com/ bereitgestellt wird, zu verwenden, um die ProjectRecords separat einzufügen. Ich konnte jedoch keine Möglichkeit finden, ProjectRecords zu lösen.

Ich habe daher versucht, die gesamte Project-Entity groß einzufügen:

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

        context.SaveChanges();

Dies scheint jedoch eine lange Zeit zu dauern, um nichts an der Datenbank zu tun. Ich denke deshalb, dass ich völlig falsch liege.

Ich habe den Kontext nicht verfügbar, wenn ich das Projekt der Arbeitgeber-Entität hinzufüge, und ich möchte es nicht verfügbar machen, wenn ich es vermeiden kann, da ich versuche, sie getrennt zu halten.

Gibt es eine Möglichkeit, die Leistung zu verbessern, verwenden Sie die Bulk-Insert-Erweiterung oder sql Bulk-Kopie von wo ich SaveChanges auf meinem Kontext aufrufen?

Jede Hilfe wird sehr geschätzt.

Akzeptierte Antwort

Ein Vorschlag wäre, die ProjectRecords nicht erst beim Laden an den Kontext anzuhängen, wenn dies möglich ist. Du könntest etwas wie ein verwenden

Dictionary<Project, List<ProjectRecord>>

um sie zu speichern und beim Abrufen des Project und beim Festlegen von ProjectRecord.Project beim Speichern zu helfen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow