我是實體框架的新手。我碰到過這樣一個場景,我有我的實體:實體框架有選擇地從上下文中保存跟蹤實體並批量插入其他實體
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