programing

ASP의 경우 "모델을 만드는 동안에는 컨텍스트를 사용할 수 없습니다." 예외입니다.NET 아이덴티티

newsource 2023. 8. 23. 21:49

ASP의 경우 "모델을 만드는 동안에는 컨텍스트를 사용할 수 없습니다." 예외입니다.NET 아이덴티티

AccountApiController에 전화를 걸 때 이 문제가 발생하는 이유는 무엇입니까?방법을 등록하시겠습니까?

  • 문맥을 사용하려는 것은 무엇입니까?
  • 무엇이 문맥을 창조하려고 노력하고 있습니까?
  • 우리는 어떻게 이것을 피할 수 있습니까?
  • 이걸 어떻게 디버그합니까?

"메시지": "오류가 발생했습니다." ,

"예외 메시지":"모델을 만드는 동안에는 컨텍스트를 사용할 수 없습니다.이 예외는 컨텍스트가 OnModelCreating 메서드 내에서 사용되거나 여러 스레드에서 동시에 동일한 컨텍스트 인스턴스에 액세스하는 경우 발생할 수 있습니다.DbContext 및 관련 클래스의 인스턴스 멤버는 스레드 안전성이 보장되지 않습니다." ,

"예외 유형":"시스템.잘못된 작업예외",

"스택 추적":"

시스템에서.웹.Http.APIController.d_1입니다.다음으로 이동()

예외가 발생한 이전 위치의 스택 추적 끝

시스템에서.런타임.컴파일러 서비스.작업 대기자입니다.성공하지 못한 경우 던지기(작업)

시스템에서.런타임.컴파일러 서비스.작업 대기자입니다.NonSuccessAndDebugger 알림 처리(작업 > 작업)

시스템에서.웹.Http.발송인.HttpControllerDispatcher.d_0입니다.다음으로 이동()"

문제는 우리가 MS가 권장하는 공장 패턴을 사용하지 않고 있다는 것입니다.

Factory 구현을 사용하여 OWIN 컨텍스트에서 UserManager 인스턴스를 가져올 수 있습니다. ...응용 프로그램에 대한 요청별로 UserManager 인스턴스를 가져오는 권장 방법입니다.

여러 요청과 스레드가 DbContext를 공유했기 때문에 "동일한 컨텍스트 인스턴스는 여러 스레드에 의해 동시에 액세스됩니다."

다음 내용이 맞습니다.UserManagerFactory 함수에 대한 각 호출에 대해 MyDbContext의 새 인스턴스를 만듭니다.

UserManagerFactory 
= () => new UserManager<IdentityUser>(new UserStore<IdentityUser>(new MyDbContext()));

다음은 올바르지 않습니다.비슷하게 생겼지만 UserManagerFactory에 대한 각 호출에 대해 새 인스턴스를 만들지는 않습니다.이것은 우리가 사용하던 것입니다, 우리의 사이트가 망가졌습니다.

var userStore = new UserStore<IdentityUser>(new MyDbContext());                    
var userManager = new UserManager<IdentityUser>(userStore);
UserManagerFactory = () => userManager;

이 오류는 잘못된 경우에도 발생할 수 있습니다.connectionString확인 여부connectionString유효합니다(타포 등 없음).

OnModelCreating 메서드를 재정의합니까?만약 그렇다면, 당신은 그것을 공유하거나 전체 컨텍스트 클래스를 공유할 수 있습니까?

그렇지 않은 경우 오류 메시지의 다음 사항에 주의해야 합니다.

또는 여러 스레드에서 동시에 동일한 컨텍스트 인스턴스에 액세스하는 경우.DbContext 및 관련 클래스의 인스턴스 멤버는 스레드 안전성이 보장되지 않습니다.

그래도 도움이 되지 않는다면 Visual Studio에서 만든 변경되지 않은 웹 API 프로젝트를 사용합니까?

TL&DR: 모델 시드를 목표로 하고 있고 엔티티 프레임워크를 사용하고 있다면, 다음 링크를 검토할 것을 강력히 제안합니다. https://learn.microsoft.com/en-us/ef/core/modeling/data-seeding

이 링크는 마이그레이션 자체 중에 데이터를 직접 시드하는 방법을 자세히 설명합니다.이것은 일반적으로 응용프로그램의 시작 대신 데이터베이스를 작성하는 동안 데이터를 시드할 때 유용합니다.

Table/View에서 레코드를 가져오는 경우 DB 객체에 대한 액세스 권한이 충분한지 확인합니다.

저도 같은 문제가 있었고 실행하여 해결했습니다.

sp_change_users_login [ @Action = ] 'action' [ , [ @UserNamePattern = ] 'user' ] [ , [ @LoginName = ] 'login' ] [ , [ @Password = ] 'password' ] [;]


sp_change_users_login 'update_one' 'dbuser' 'dblogin'

추가 스니펫 및 세부 정보 찾기

MySQL과 함께 다중 계층 아키텍처에서 EF Code First를 사용하고 있으며 동일한 예외가 있으며 DB Context Class 구조 작업 내에서 다음 행을 사용합니다.

Database.SetInitializer<EntitiesName>(null);

Shaun Luttin의 주요 답변에 동의하지만,

저의 경우: 배포 후 이 오류가 발생하여 SSL 인증서를 삽입한 후 Hsts Preload를 사용했기 때문이라는 것을 알게 되었습니다.이 줄의 주석을 제거하면 리디렉션이 해결되었고, 이 오류가 완전히 해결되었습니다.

 //app.UseHsts(options => options.MaxAge(days: 18 * 7).IncludeSubdomains().Preload());

언급URL : https://stackoverflow.com/questions/21344232/context-cannot-be-used-while-the-model-is-being-created-exception-with-asp-net