批量插入數據實體框架7

asp.net-core c# entity-framework-core

通常在我以前的項目中,我可以通過傳遞一個對象列表作為下面的代碼來進行批量插入

public void Create(List<ApplicationUserRole> item)
{           
        foreach (var data in item)
        {
            _dbContext.ApplicationUserRole.Add(data);
        }
        _dbContext.SaveChanges();           
}

但是現在我一直在犯錯誤

InvalidOperationException:無法跟踪實體類型“Docdoc.Models.ApplicationUserRole”的實例,因為已經跟踪了具有相同鍵的此類型的另一個實例。對於新實體,請考慮使用IIdentityGenerator生成唯一鍵值。

我需要在下面更改我的代碼才能工作

    foreach (var data in item)
    {
        _dbContext.ApplicationUserRole.Add(data);
        _dbContext.SaveChanges();
    }

我知道這是非常糟糕的做法。插入大量數據會使性能變得非常慢

解決這個問題的任何方法?

一般承認的答案

您看到的異常消息可能無法通過在每次添加後調用“SaveChanges”來修復。問題的根本原因是您的DbContext實例已經有一個具有相同密鑰的ApplicationUserRole實體(猜測它是ApplicationUserRole.Id或其他東西)。 此錯誤很常見 ,通常是由手動設置臨時鍵值引起的,例如將ApplicationUserRole.Id設置為-1。 (例如,請參閱https://github.com/aspnet/EntityFramework/issues/4488 。)

如果錯誤不是由錯誤設置臨時鍵值引起的,那麼還要確保您的DbContext實例是短暫的並且僅在一個線程中使用。換句話說,僅將DbContext用於一個操作。

public void Create(List<ApplicationUserRole> item)
{         
    using (var context = new MyContext())
    {  
        context.ApplicationUserRole.AddRange(data);
        context.SaveChanges();  
    }         
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow