Programing

LINQ To Entity [duplicate] 세션에서 다른 스레드가 실행 중이므로 새 트랜잭션이 허용되지 않습니다.

crosscheck 2020. 6. 20. 10:27
반응형

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(), 루프가 종료 된 후 한 번만 호출 하면 코드 속도가 향상됩니다.

참고 URL : https://stackoverflow.com/questions/10096509/new-transaction-is-not-allowed-because-there-are-other-threads-running-in-the-se

반응형