У меня есть база данных, созданная с использованием кода EF.Работа с данными осуществляется с помощью DbContext
.Контейнер IoC в приложении Asp.net генерирует экземпляр DbContext
, на который объекты BL полагаются в расчете на поток.Это класс фоновых задач, который загружается вместе с веб-приложением.
Каждое время (например, каждые 10 минут) фоновый поток добавляет один элемент в список Incidents
, вызывая * 1006.* в рамках транзакции.
Между тем, создается впечатление, что если один из Incidents
изменяется на myDbContext
в «потоке веб-запросов», даже если изменения на мгновение сохраняются в базе данных, они переопределяютсянабор Incidents
, которые были извлечены фоновым потоком за несколько секунд до того, как пользователь использовал веб-страницу для изменения Incident
.
Это похоже на проблему параллелизма (и я нереализовать любой параллелизм, такой как столбцы Timestamp).
Мой вопрос: разве фоновый поток не должен сохранять только измененные данные (в моем случае, добавляя новый инцидент), оставляя всю коллекцию инцидентов?Если это действительно так, мой источник проблемы находится где-то еще.
Код из фонового потока:
using (var transaction = new TransactionScope())
{
foreach (var scheduledTask in _db.ScheduledTasks)
{
if (scheduledTask.NextExecuteAfterDate == null)
{
PopulateNextExecuteAfterDate(scheduledTask);
shouldSaveChanges = true;
}
if (DateTime.Now > scheduledTask.NextExecuteAfterDate)
{
RegisterRecurringTicket(scheduledTask);
CalculateNextTime(scheduledTask);
shouldSaveChanges = true;
}
}
if (shouldSaveChanges) _db.SaveChanges();
transaction.Complete();
}
Код в подпрограмме RegisterRecurringTicket(scheduledTask);
добавляет элемент в коллекцию инцидентов.Когда вызывается _db.SaveChanges();
, создается впечатление, что коллекция инцидентов перезаписывается более старым набором инцидентов, что приводит к тому, что сгенерированные пользовательским интерфейсом изменения в коллекции инцидентов устарели.Если да, как я могу решить эту проблему?