實體框架有選擇地從上下文中保存跟踪的實體並批量插入其他實體

bulkinsert c# entity-framework sqlbulkcopy

我是Entity Framework的新手。我遇到過一個我擁有實體的場景:

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的方法。

因此,我嘗試批量插入整個Project實體:

        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附加到上下文中。你可以使用類似的東西

Dictionary<Project, List<ProjectRecord>>

保存它們並幫助檢索Project並在保存時設置ProjectRecord.Project



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因