2015-07-20 92 views
1

我是实体框架的新手。我碰到过这样一个场景,我有我的实体:实体框架有选择地从上下文中保存跟踪实体并批量插入其他实体

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个项目记录并将该项目记录列表添加到项目中。

实体框架正在跟踪所有这些,虽然它不是特别快,但并不算太坏。

缓慢的部分是当我在上下文中调用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(); 

不过,这似乎需要很长的时间做什么到数据库。因此,我认为我完全错了。

当我将项目添加到雇主实体时,我没有上下文可用,并且我不想让它可用,如果我可以避免它,因为我试图让它们分开。

有没有什么办法来提高性能,使用批量插入扩展或从我的上下文调用SaveChanges的sql批量复制?

任何帮助,非常感谢。

+0

如果你打算分别批量插入它们,为什么要把'ProjectRecord'放在第一位呢? – jjj

回答

0

如果可能的话,一个建议是不要将ProjectRecords附加到上下文中。你可以使用像一个

Dictionary<Project, List<ProjectRecord>> 

持有他们在检索Project和设置ProjectRecord.Project当您保存帮助。

+0

谢谢,我认为这是我必须要做的。 – Max