반응형
LINQ To Entity [duplicate] 세션에서 다른 스레드가 실행 중이므로 새 트랜잭션이 허용되지 않습니다.
이 질문에는 이미 답변이 있습니다.
이것이 왜 깨질 수 있는지에 대한 아이디어가 있습니까?
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 엔티티 컬렉션을 반복 한 다음 다른 연결을 사용하여 변경 사항을 저장한다는 것입니다. 이것은 클래스가 기본적으로 하나의 DB 연결 인스턴스와 "결혼"되어 다른 클래스에서 변경할 수 없기 때문에 발생합니다.
이 문제를 해결하는 방법은 .ToList()
컬렉션을 반복하기 전에 호출 하는 것입니다.
그리고 당신이 그것을하고있는 동안 context.SaveChanges()
, 루프가 종료 된 후 한 번만 호출 하면 코드 속도가 향상됩니다.
반응형
'Programing' 카테고리의 다른 글
두 개의 두 숫자 사이의 난수 (0) | 2020.06.20 |
---|---|
UIPanGestureRecognizer-세로 또는 가로 만 (0) | 2020.06.20 |
배경 이미지가로드되었는지 어떻게 확인할 수 있습니까? (0) | 2020.06.19 |
ListView의 재활용 메커니즘 작동 방식 (0) | 2020.06.19 |
3 방향 병합이 2 방향 병합보다 유리한 이유는 무엇입니까? (0) | 2020.06.19 |