2015-07-20 93 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