Новая транзакция не допускается, поскольку в сеансе есть другие streamи 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» – это сбор результатов в моем случае

Переменная pp – это не набор объектов, это перечислитель, который может возвращать объекты. Пока вы используете перечислитель, источник должен оставаться открытым.

Используйте метод ToList для реализации перечислителя в коллекцию. Это будет читать все элементы из перечислителя и закрыть соединение с источником, чтобы вы могли использовать соединение для других вещей.

 foreach (var p in pp.ToList()) 

Что происходит, так это то, что вы используете одно соединение SQL для итерации по совокупности объектов db, а затем с помощью другого соединения для сохранения изменений. Это происходит потому, что ваши classы в основном «женаты» на один экземпляр вашего соединения db и не могут быть изменены другим.

Чтобы обойти это, нужно вызвать .ToList () в своей коллекции перед ее итерацией.

И пока вы на это, вызовите context.SaveChages() только один раз после завершения цикла для ускорения кода.