2016-11-30 2 views
0
for (int i = 0; i < skus.Count; i++) 
{ 
    sku item = new sku(); 
    item = skus[i]; 
    sku sku = CompanyDbContext.skus.Where(s => s.item_no == item.item_no).FirstOrDefault(); 

    if (sku == null) // ok to insert [no duplicate item numbers] 
    { 
     CompanyDbContext.skus.Add(item);        
    } 

} 
CompanyDbContext.SaveChanges(); 

Я получаюОшибки при добавлении нескольких элементов объекта

коллекция была изменена операция перечисления не может выполнить

ошибки. Как я могу это исправить ?

+1

Кажется, дубликат вопроса. См. Здесь 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 –

+0

Это не сработало для меня. Вот почему я спросил новый –

+0

Ну, вы в основном изменяете то же, что и итерации. Может быть, решение было бы создать временную переменную списка, где вы бы добавили все элементы, которые нормально вставлять, а затем, когда вы закончите цикл, добавьте их все за один раз? –

ответ

0

Как уже упоминалось в комментариях, это происходит потому, что вы изменяете коллекцию, которую вы Перебор, как вы выполняете свою работу.

Один из вариантов у вас есть, чтобы создать временную коллекцию и добавить свои 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(); 
0

Проблема в том, что вы изменяете то же самое, что и итерации. Как передовой практики вы должны обновить свой метод что-то вроде этого:

//get search predicat from List<sku> skus 
var item_nos = skus.Select(s=>s.item_no).ToList(); 
//items already in repo 
var addedItems = CompanyDbContext.skus.Where(s => item_nos.Contains(s.item_no)).ToList(); 
var newItems = skus.Except(addedItems).ToList(); 
foreach(var sku in newItems){ 
    CompanyDbContext.skus.Add(item); 
} 
CompanyDbContext.SaveChanges(); 
Смежные вопросы