У меня проблема с обновлением записей в цикле 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» поле, правда, так что он не будет быть выбранным на следующей итерации моего сервиса. Проблема в том, что мой метод не обновляет БД и всегда «ловит» все мои записи.
контексте EntityFramework поддерживает шаблон UnitOfWork. Лучше вызывать 'SaveChanges()' только один раз после цикла. – haim770
Это сделало трюк :) Большое спасибо! –
В интересах закрытия вопроса, @ haim770 не могли бы вы оставить свой комментарий в качестве ответа для OP, чтобы принять его? Таким образом, он исчезнет из оставшегося без ответа списка. – Clint