Entity Framework 从上下文中选择性地保存跟踪的实体并批量插入其他实体

Entity Framework selectively save tracked entities from context and bulk insert others

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

我创建我的上下文,加载 Employer,然后将雇主对象传递给另一个 class,后者将一个项目添加到我的雇主实体,然后我从一个文件中加载大约 300,000 条项目记录并添加这个列表项目记录到项目。

Entity Framework 正在跟踪这一切,虽然速度不是特别快,但还不错。

最慢的部分是我在上下文中调用 SaveChanges() 时。我希望能够从我的上下文中分离项目记录列表并在没有它们的情况下保存项目,然后使用 https://efbulkinsert.codeplex.com/ 提供的批量插入扩展单独批量插入项目记录。但是我找不到分离 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 附加到上下文。你可以使用类似 a

Dictionary<Project, List<ProjectRecord>>

保存它们并在您保存时帮助检索 Project 和设置 ProjectRecord.Project