Новая транзакция не допускается, поскольку в сеансе есть другие потоки LINQ To Entity
Любые идеи о том, почему это может быть нарушено?
foreach (var p in pp)
{
ProjectFiles projectFile = (ProjectFiles)p;
projectFile.Status = Constants.ProjectFiles_ERROR;
projectFile.DateLastUpdated = DateTime.Now;
context.SaveChanges();
}
Я читал, что обходной путь - это получение результатов за один проход до цикла foreach.
Но разве я этого не сделал? "pp" - это сбор результатов в моем случае
Ответы
Ответ 1
Переменная pp
не представляет собой набор объектов, это перечислитель, который может возвращать объекты. Пока вы используете перечислитель, источник должен оставаться открытым.
Используйте метод ToList
, чтобы реализовать перечислитель в коллекцию. Это будет читать все элементы из перечислителя и закрыть соединение с источником, чтобы вы могли использовать соединение для других вещей.
foreach (var p in pp.ToList())
Ответ 2
Происходит то, что вы используете одно соединение SQL для перебора коллекции сущностей БД, а затем используете другое соединение для сохранения изменений. Это происходит потому, что ваши классы в основном "женаты" на одном экземпляре вашего соединения с БД и не могут быть изменены другим.
Чтобы обойти это, вызовите .ToList()
для вашей коллекции перед ее повторением.
И пока вы это делаете, вызывайте context.SaveChanges()
только один раз после выхода из цикла, чтобы ускорить код.