2013-01-19 3 views
0

저는 MySQL을 사용합니다 (MARS를 지원하지 않습니다). 그리고 병렬로 여러 개의 SELECT을 실행하려고합니다. 연결 문자열은 동일하지만 각 SELECT에 대해 다른 db 컨텍스트를 만듭니다.EF의 다중 컨텍스트에서 다중 SELECT에 MARS가 필요합니까?

그것은 다음과 같습니다

using (var db = DataContextCreator.Instance.Create()) 
{ 
    return db.Customers 
      .Where(it => it.customer_Id > 10) 
      .Detach(db.Customers); 
} 

단어에 대한 Detach - 그것은 기록의 기록 또는 무리를 취 헬퍼 방법입니다. 두 번째 경우에는 그것들을 (구체적인 데이터로 만들기 위해) 목록을 만들고, 분리 된 데이터를 돌려 보내는 db 컨텍스트로부터 레코드를 분리한다 (GC가 db 컨텍스트를 해제 할 수있다).

지금은 "이 Connection과 관련된 열린 DataReader가 이미 닫혀 있어야합니다."라는 두려운 말에 대한 오류가 나타납니다. DataReader를 명시 적으로 사용하지 않았으므로 100 % 이유가 확실합니다.

단일 연결 문자열을 사용하여 해당 db 컨텍스트를 모두 작성했기 때문입니까? 또는 다른 말로 표현하자면 위의 시나리오에서 MARS가 필요합니까?

나는 바퀴를 재발 명하고 싶지 않기 때문에 물었습니다. 그리고 내 모든 쿼리가 다소 작고 빠르기 때문에 바보 같은 해결 방법에 대해 생각하고 있습니다. DB 컨텍스트 생성자에서 잠금을 사용하고 있습니다. 이 방법은 데이터베이스를 쿼리하는 각 블록이 다른 블록과 병렬로 실행되지 않는다는 것을 보장합니다.

답변

1

하나의 SqlConnection 개체에서 동시에 여러 쿼리를 실행하는 경우 MARS는 하나의 요소입니다.

일반적으로 모든 DbContext 개체는 고유 한 DbConnection 개체를 가지므로 여기에는 문제가 없을 것입니다.

여기에있는 문제는 Detach 메서드를 호출하여 쿼리가 여전히 실행 중일 때 호출하는 것입니다.

목표를 달성하기 위해 AsNoTracking 확장 방법을 사용하는 것이 좋습니다. 나는 모든 DB 컨텍스트를 만드는 하나의 연결 문자열을 사용하기 때문에

return db.Customers.Where(it => it.customer_Id > 10).AsNoTracking().ToList(); 
+0

문제를 공개 했으므로 백만 설명해 주셔서 감사합니다. 나는 여러 개의 db 문맥을 사용하지만 동일한 'EntityConnection'을 계속해서 전달합니다. 이제는 문자열 (연결 문자열)을 전달하고 db 컨텍스트와 엔티티 연결을 동시에 생성하는 것으로 변경했습니다. 그래서 저는 둘 다 곱했습니다. 그리고 그 변화 이후 - 그것은 효과가있었습니다! – greenoldman

+0

좋아, 나는 너가 이미 그것을하고 있었다는 것을 생각했다. 네, 매번'EntityConnection' 객체를 만드는 것이 당신의 경우에 들어가는 길입니다. ^^; –

2

가 있습니다 :입니다

, I는 함수 반환을 작성합니다?

아니요. 단일 연결 문자열의 결과 일 수는 없습니다. 귀하의 DataContextCreator.Instance.Create()은 동일한 연결을 기반으로 컨텍스트를 반환한다고 가정합니다. DataContextCreator 코드를 제공해 주시겠습니까? 특히 재산 Instance.

+0

감사합니다. Jean은 조금 빠르므로 이미 문제를 해결했습니다. 사실 그것은 db 컨텍스트 생성자 내부에있었습니다. 여러 개의 db 컨텍스트를 만들었지 만 하나의 엔티티 연결을 사용했습니다. – greenoldman

관련 문제