2015-05-25 3 views
2

Когда я установил db.Entry(episode).State = EntityState.Deleted EF удаляет эпизод из моего списка и выдает collection was modified enumeration operation may not execute.EntityState.Deleted удаляет элементы из моего списка

Вот мой код:

public async Task UpdateAsync(List<Episode> episodes) 
{ 
    using (var db = new DbContext()) 
    { 
     var serie = await db.Series.Include(s => s.Episodes).SingleOrDefaultAsync(s => s.Id == id); 

     foreach (var episode in serie.Episodes) 
     { 
      var modifiedEpisode = episodes.Where(e => e.Id == episode.Id).SingleOrDefault(); 

      //was deleted 
      if (modifiedEpisode == null) 
      { 
       db.Entry(episode).State = EntityState.Deleted;// episode is removed from serie.Episodes throwing exception 
       continue; 
      } 
     } 

     var addedEpisodes = episodes.Where(v => v.Id == Guid.Empty).ToList(); 
     serie.Episodes.AddRange(addedEpisodes); 

     await db.SaveChangesAsync(); 
    } 
} 

Как я могу удалить эпизоды?

ответ

1

Как сказал Шираз Бхайдзи, вы не можете удалить элемент из списка, в то время как этот список является источником инструкции foreach. Простой ToList() может решить вашу проблему

foreach (var episode in serie.Episodes.ToList()) 
     { 
      var modifiedEpisode = episodes.Where(e => e.Id == episode.Id).SingleOrDefault(); 

      //was deleted 
      if (modifiedEpisode == null) 
      { 
       db.Entry(episode).State = EntityState.Deleted;// episode is removed from serie.Episodes throwing exception 
       continue; 
      } 
     } 

ответ Шираз Bhaiji является также правильно!

+0

Эпизоды уже являются списком, а не IEnumerable, поэтому ToList не будет работать. – MuriloKunze

+0

, являющийся списком, не является проблемой ... проблема в том, что вы удаляете элемент из источника инструкции foreach. Взгляните на http://stackoverflow.com/questions/604831/collection-was-modified-enumeration-operation-may-not-execute, у этого парня был такой же problm –

+0

У меня нет идеи почему, но звоните в список решить проблема (поскольку Episoder - это список). – MuriloKunze

1

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

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

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

+0

Проблема в db.Entry (эпизод) .State = EntityState.Deleted; Эта строка удаляет один элемент моего списка и вызывает исключение. – MuriloKunze

Смежные вопросы