[entity-framework] Entity Framework 6의 다중 비동기?

이것은 내 코드입니다.

var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);

하지만 컨트롤러에서 함수를 호출했을 때. 오류를 보였습니다

이전 비동기 작업이 완료되기 전에이 컨텍스트에서 두 번째 작업이 시작되었습니다. 이 컨텍스트에서 다른 메서드를 호출하기 전에 비동기 작업이 완료되었는지 확인하려면 ‘await’를 사용하십시오. 모든 인스턴스 멤버는 스레드 안전이 보장되지 않습니다.

이 문제를 해결하도록 도와주세요.



답변

예외는 한 번에 허용되는 컨텍스트 당 하나의 비동기 작업 만 있음을 명확하게 설명합니다.

따라서 await오류 메시지에서 알 수 있듯이 한 번에 하나씩 수행 해야 합니다.

var banner = await context.Banners.ToListAsync();
var newsGroup = await context.NewsGroups.ToListAsync();

또는 여러 컨텍스트를 사용할 수 있습니다.

var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);


답변

데이터 공급자 삽입에 IoC 컨테이너를 사용하는 경우 수명주기에 “일시적”또는 “PerWebRequest”유형을 사용하는 것이 좋습니다.

예 : https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md


답변

예를 들어 리포지토리 패턴과 함께 종속성 주입에 Unity를 사용하는 경우 create / update / delete와 함께 두 개 이상의 컨텍스트를 사용하면 다음 오류가 발생합니다.

두 개체가 서로 다른 ObjectContext 개체에 연결되어 있으므로 두 개체 간의 관계를 정의 할 수 없습니다.

이것은를 사용하여 해결할 수 있습니다 PerRequestLifetimeManager. 여기에 더 많은 정보 :

C # EF6는 Unity-Asp.Net Web Api를 사용하여 하나의 컨텍스트에 대해 여러 비동기 호출을 수행합니다.

container.RegisterType<DbContext>(new PerRequestLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();


답변