【问题标题】:Entity Framework selectively save tracked entities from context and bulk insert others实体框架有选择地从上下文中保存跟踪的实体并批量插入其他实体
【发布时间】:2015-07-20 17:30:31
【问题描述】:

我对实体框架相当陌生。我遇到了一个我拥有实体的场景:

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,然后将雇主对象传递给另一个类,该类将项目添加到我的雇主实体,然后我从文件中加载大约 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,为什么要先附加它们?

标签: c# entity-framework bulkinsert sqlbulkcopy


【解决方案1】:

如果可能的话,建议在加载 ProjectRecords 时首先不要将它们附加到上下文中。你可以使用类似的东西

Dictionary<Project, List<ProjectRecord>>

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

【讨论】:

  • 谢谢,我想这是我必须要做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2020-11-28
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多