0

나는 그렇게 같은 BAL 내 DAL에서 개체를 반환하는 n 층 asp.net 응용 프로그램이 최종 사용자에게 표시 할 계층입니다. 내 응용 프로그램의 다른 레이어에서 쿼리 실행을 막기 위해 게으른로드를하지 않습니다.닷넷 엔터티 ObjectContext는 스레드 오류

New transaction is not allowed because there are other threads running in the session

:

public void Delete(SourceKey sk) 
{ 
    try 
    { 
     _dataContext.DeleteObject(sk); 
     _dataContext.SaveChanges(); 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex.Message + " " + ex.StackTrace + " " + ex.InnerException); 
    } 
} 

내가 호출 "오기"기능을 호출 한 후 "삭제"보십시오, 나는이 오류가 :

나는 개체를 삭제하는 내 DAL에서 다른 함수를 생성 이것은 ASP.Net 응용 프로그램입니다. 내 DAL에는 엔터티 데이터 모델이 포함되어 있습니다. 위의 함수가있는 클래스는 동일한 _dataContext를 공유하며, 이는 내 생성자에서 인스턴스화됩니다. 내 추측은 독자가 여전히 "Get"기능에서 열리고 닫히지 않았다는 것입니다. 어떻게 닫을 수 있습니까? 결과와 시도를 통해 내 UI 층에서

, 내가 루프과 같이 삭제하기 :

foreach(SourceKey sk in skm.Get(new SourceKey())) 
{ 
    Debug.WriteLine(sk.sourceKey1); 

    skm.Delete(sk); 
} 

편집 오류이 줄로 발생되는

:

_dataContext.DeleteObject(sk); 

답변

1

나는 이것이 Linq에 의한 질의 처리와 관련이 있다고 생각한다. 나는 과거에 읽은 기사를 기반으로 추측하고 있지만 쿼리가 지연 실행되었다고 생각합니다. 열거자가 처음 사용 된 시점 (첫 번째 MoveNext 호출)에서 쿼리가 열리고 닫히지 않습니다 열거가 완료 될 때까지

열거 형을 제어하는 ​​경우 열거자를 완료하고 그 결과가 차이가 나는지 확인할 수 있습니다. 또는 어쩌면 쿼리가 실행되는 방식을 제어 할 수있는 구성이있을 수 있습니다.하지만 이는 내가 본 것 이상입니다.

+0

쿼리가 AsEnumerable()에서 실행 된 것이지요. 나는 foreach 루프에서 삭제를 가져 갔고 효과가있었습니다. –