2

Entity Framework 호출에 이상한 오류가 발생했으며 동일한 ObjectContext을 사용하여 동시 멀티 스레드 액세스가 가능하다는 가능성을 모색 중입니다.ThreadLocal EF 컨텍스트 만들기

ThreadLocal 안에 생성 컨텍스트를 넣어서 모든 스레드에 대한 새 컨텍스트를 만들려고했습니다.

private System.Threading.ThreadLocal<EF.XYZEntities> threadLocalContext = new System.Threading.ThreadLocal<EF.XYZEntities>(() => new EF.XYZEntities(connectionString)); 
private EF.XYZEntities context { get { return threadLocalContext.Value; } } 

이것은 작동하지 않습니다. 해당 컨텍스트를 처음 사용할 때 오류가 발생합니다.

Invalid object name 'dbo.Site'.

어떻게 작동합니까?

+2

나는 쓰레드 내에서 컨텍스트를 생성하고,'using' 블록으로 싸서, 멋지게 범위가 지정 될 것이다. 컨텍스트를 만드는 것은 비싼 작업이 아닙니다 ... –

+0

아마도 관련이 있을까요? http://stackoverflow.com/questions/9415955/c-sharp-working-with-entity-framework-in-a-multi-threaded-server – rene

답변

1

모든 것을 잘 관리하지 않으면 공유 컨텍스트를 사용하는 것이 일반적으로 '나쁜'것으로 간주됩니다. 잘 관리되지 않은 공유 컨텍스트를 사용하면 매우 이상한 결과가 발생할 수 있습니다.

using (DBEntities ctx = new DBEntities()) 
{ 
    // Explicitly open the context connection yourself - to help prevent connection pooling/sharing 
    // The connection will automatically be closed once exiting the using statement, 
    // but it won't hurt to put a ctx.Connection.Close(); after everything inside the using statement. 
    ctx.Connection.Open(); 

    // Do Stuff 

    // If necessary ctx.SaveChanges(); 
    // Not necessary but you could put a ctx.Connection.Close() here, for readability if nothing else. 
} 

UPDATE :

그것은 다음과 같이 컨텍스트와 작업 방식의 유닛을 위해 일반적으로 가장 좋은 방법입니다 비동기 및 EF에 대한 아래 Noseratio의 댓글에 답글 달기에서.

  • 스레드 안전
  • 비동기 지연로드
: Taken from here

비 목표 다음

우리가 명시 적으로 EF6의 기능을 활성화하려고하지 않는 것들

스레드 안전성

스레드 안전성이 비동기를 더욱 유용하게 만드는 반면 직각 특성입니다. EF가 상태를 유지하기 위해 사용자 코드로 구성된 그래프와 상호 작용하고이 코드가 스레드 안전성을 보장하는 쉬운 방법이 없다는 것을 감안할 때 우리가 가장 일반적인 경우에이를 지원할 수 있는지 여부는 불분명합니다. 순간

는, EF는 개발자가 한 번에 두 개의 비동기 작업을 실행하고 던져하려고하면

는 EF에서

비동기 지원은 .NET 4.5 을 필요로 .... 감지하고 .NET 4에서 사용할 수 없습니다

+0

'async/await'가 여전히 문제가 될 수 있습니다. 'using' 내부에서 사용됩니다. [more details] (http://stackoverflow.com/q/20993007/1768303). – Noseratio