>백엔드 개발 >C++ >내 Entity Framework 코드에서 '세션에서 실행 중인 다른 스레드가 있기 때문에 새 트랜잭션이 허용되지 않습니다'가 발생하는 이유는 무엇입니까?

내 Entity Framework 코드에서 '세션에서 실행 중인 다른 스레드가 있기 때문에 새 트랜잭션이 허용되지 않습니다'가 발생하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-16 13:36:59315검색

Why Does My Entity Framework Code Throw

Entity Framework 모델을 업데이트하는 동안 트랜잭션 오류 발생

두 개의 별도 데이터베이스에서 엔터티를 연결하려고 할 때 개발자는 "새로 만들기" 오류가 발생할 수 있습니다. 세션에서 실행 중인 다른 스레드가 있기 때문에 트랜잭션이 허용되지 않습니다." 이 당황스러운 메시지는 여러 루프와 Entity Framework 컨텍스트를 통합하는 코드를 시도할 때 발생할 수 있습니다.

기본적인 문제는 EF(Entity Framework)가 생성된 각 컨텍스트에 대해 세션을 유지한다는 사실에서 비롯됩니다. 여러 스레드가 동일한 컨텍스트에 동시에 액세스하면 트랜잭션 충돌이 발생할 수 있습니다. 이 문제를 해결하려면 서로 다른 스레드에서 동일한 컨텍스트를 수정하지 않는 것이 중요합니다.

제공된 예에서 오류의 근본 원인은 EF 쿼리에 중첩된 foreach 루프를 사용했기 때문입니다. 이 접근 방식은 외부 루프의 각 반복마다 새로운 EF 컨텍스트가 생성되어 수많은 활성 세션이 동일한 컨텍스트에 동시에 액세스하게 됨을 의미합니다.

최적의 솔루션은 쿼리를 사용하여 EF에서 데이터를 검색하고 저장하는 것입니다. 중간 컬렉션(예: IList)에 있습니다. 이를 통해 트랜잭션 충돌을 일으키지 않고 후속 반복마다 컨텍스트를 삭제하고 새 컨텍스트를 생성할 수 있습니다.

다음은 설명하기 위해 수정된 코드의 예입니다.

IList<Client> clientList = from a in _dbFeed.Client.Include("Auto") select a;
foreach (RivWorks.Model.NegotiationAutos.Client client in clientList)
{
   var companyFeedDetailList = from a in _dbRiv.AutoNegotiationDetails where a.ClientID == client.ClientID select a;
    // ...
}

컨텍스트에서 데이터를 검색하여 거래가 중복될 위험을 제거하고 오류가 발생하지 않도록 합니다.

위 내용은 내 Entity Framework 코드에서 '세션에서 실행 중인 다른 스레드가 있기 때문에 새 트랜잭션이 허용되지 않습니다'가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.