2015-04-27 10 views
1

У меня проблема с обновлением записей в цикле foreach. У меня есть метод, который экспортирует файлы из SQL таблицы и сохраняет их на чистую долю:Обновление записей в цикле foreach в Entity Framework 6

public static void SyncOpportunity() 
    { 
     using (var ctx = new BPMOnline74Entities()) 
     { 
      logger.Debug("Importing files from Opportunities."); 
      var oppFiles = from o in ctx.OpportunityFile 
          where SqlFunctions.DataLength(o.Data) > 0 && o.ServiceProcessed == false 
          select o; 

      foreach (OpportunityFile opp in oppFiles) 
      { 
       logger.Debug(string.Format("{0} is being imported.", opp.Name)); 
       string fileName=""; 
       if (opp.OpportunityId == null) 
       { 
        fileName = "E:\\BPM\\Opportunity\\"; 
        logger.Error("File not bound to any DB object. Saved in E:\\BPM\\Opportunity."); 
       } 
       else 
       { 
        try 
        { 
         fileName = PathInfo.GetPath("Opportunity", (Guid)opp.OpportunityId); 
        } 
        catch (Exception ex) 
        { 
         logger.Error(ex.Message.ToString()); 
        } 
       } 
       try 
       { 
        File.WriteAllBytes(fileName + opp.Name, opp.Data); 
        logger.Debug(string.Format("{0} was exported from SQL.", opp.Name)); 
        opp.ServiceProcessed = true; 
        ctx.Entry(opp).State = System.Data.Entity.EntityState.Modified; 
        ctx.SaveChanges(); 
       } 
       catch(Exception ex) 
       { 
        logger.Error(ex.Message.ToString()); 
       } 
      } 
      logger.Debug(string.Format("Imported {0} files.", oppFiles.Count().ToString())); 
     } 
     logger.Debug("Disposing SyncOpportunity."); 
    } 

После того, как файл был успешно экспортирован из SQL Я хочу, чтобы обновить запись в «ServiceProcessed» поле, правда, так что он не будет быть выбранным на следующей итерации моего сервиса. Проблема в том, что мой метод не обновляет БД и всегда «ловит» все мои записи.

+1

контексте EntityFramework поддерживает шаблон UnitOfWork. Лучше вызывать 'SaveChanges()' только один раз после цикла. – haim770

+0

Это сделало трюк :) Большое спасибо! –

+0

В интересах закрытия вопроса, @ haim770 не могли бы вы оставить свой комментарий в качестве ответа для OP, чтобы принять его? Таким образом, он исчезнет из оставшегося без ответа списка. – Clint

ответ

2

Как обсуждалось в комментариях, поскольку Entity Framework контекст (внутренне) применяя Unit of Work шаблон, вам нужно вызвать SaveChanges() только один раз и только после того, как вы сделали изменения все детали.

Больше на MSDN

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