Entity Framework выборочно сохраняет отслеживаемые объекты из контекста и вставки вставки другие

bulkinsert c# entity-framework sqlbulkcopy

Вопрос

Я довольно новичок в Entity Framework. Я столкнулся с сценарием, где у меня есть мои сущности:

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

Я создаю свой контекст, загружаю Работодателя, а затем передаю объект работодателя другому классу, который добавляет проект в мою организацию-работодателя, а затем загружаю около 300 000 записей проекта из файла и добавляю этот список проектных записей в проект.

Entity Framework отслеживает все это, и хотя это не особенно быстро, это не так уж плохо.

Медленная часть - это когда я вызываю SaveChanges () в контексте. Мне захотелось отделить список записей проекта от моего контекста и сохранить проект без них, а затем использовать расширение объемной вставки, предоставленное с https://efbulkinsert.codeplex.com/, чтобы нагрузить вставки ProjectRecords отдельно. Однако я не мог найти способ отсоединить ProjectRecords.

Поэтому я попытался объединить все объекты проекта:

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

        context.SaveChanges();

Однако, похоже, это занимает много времени, чтобы ничего не делать с базой данных. Поэтому я думаю, что я ошибаюсь.

У меня нет контекста, когда я добавляю проект в объект Employer, и я не хочу его использовать, если я могу его избежать, поскольку я пытаюсь сохранить их отдельно.

Есть ли способ повысить производительность, использовать расширение объемной вставки или объемную копию sql, из которой я вызываю SaveChanges в моем контексте?

Любая помощь приветствуется.

Принятый ответ

Было бы предположение, что не следует прикладывать ProjectRecords к контексту в первую очередь при их загрузке, если это возможно. Вы можете использовать что-то вроде

Dictionary<Project, List<ProjectRecord>>

удерживать их и помогать в поиске Project и настройке ProjectRecord.Project при сохранении.



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему