Как уже упоминалось в комментариях, это происходит потому, что вы изменяете коллекцию, которую вы Перебор, как вы выполняете свою работу.
Один из вариантов у вас есть, чтобы создать временную коллекцию и добавить свои sku
элементы к этому, и, наконец, добавить содержимое временного List<sku>
к вашему CompanyDbContext
// Create a new temporary list
List<sku> tempSkus = new List<sku>();
for (int i = 0; i < skus.Count; i++)
{
// Let's assign item to skus[i] immediately, we don't need a new instance here when we're later re-pointing to an existing instance
sku item = skus[i];
// Use LINQ Any function to determine whether there are any existing SKU's already
bool existingSku = CompanyDbContext.skus.Any(s => s.item_no == item.item_no);
// There are no duplicates, let's add this sku item to our temporary List
if(!existingSku)
{
tempSkus.Add(item);
}
}
// Add the Range of tempSkus List to the CompanyDbContext
CompanyDbContext.skus.AddRange(tempSkus);
CompanyDbContext.SaveChanges();
Или, если вы предпочитаете LINQ
// Create a new temporary list
List<sku> tempSkus = skus.Where(p => CompanyDbContext.skus.Any(s => s.item_no != p.item_no)).ToList();
// Add the Range of tempSkus List to the CompanyDbContext
CompanyDbContext.skus.AddRange(tempSkus);
CompanyDbContext.SaveChanges();
Кажется, дубликат вопроса. См. Здесь http://stackoverflow.com/questions/604831/collection-was-modified-enumeration-operation-may-not-execute и здесь http://stackoverflow.com/questions/2024179/collection-was-modified-enumeration -operation-may-not-execute-in-arraylist –
Это не сработало для меня. Вот почему я спросил новый –
Ну, вы в основном изменяете то же, что и итерации. Может быть, решение было бы создать временную переменную списка, где вы бы добавили все элементы, которые нормально вставлять, а затем, когда вы закончите цикл, добавьте их все за один раз? –