Новая транзакция не допускается, поскольку в сеансе есть другие потоки 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() только один раз после выхода из цикла, чтобы ускорить код.