我是实体框架的新手。我碰到过这样一个场景,我有我的实体:实体框架有选择地从上下文中保存跟踪实体并批量插入其他实体
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批量复制?
任何帮助,非常感谢。
如果你打算分别批量插入它们,为什么要把'ProjectRecord'放在第一位呢? – jjj