wake-up-neo.net

"Kontext kann nicht verwendet werden, während das Modell erstellt wird" Ausnahme bei ASP.NET-Identität

Warum passiert das, wenn wir die AccountApiController.Register () -Methode aufrufen?

  • was versucht der Kontext zu verwenden? 
  • was versucht der Kontext zu schaffen? 
  • wie vermeiden wir das? 
  • wie debuggen wir das? 

"Nachricht": "Ein Fehler ist aufgetreten.",

"ExceptionMessage": "Der Kontext kann nicht verwendet werden, während das Modell erstellt wird. Diese Ausnahme wird ausgelöst, wenn der Kontext verwendet wird .__ innerhalb der OnModelCreating-Methode oder wenn dieselbe Kontextinstanz Von mehreren Benutzern aufgerufen wird Threads gleichzeitig. Beachten Sie, dass die Instanzmitglieder von DbContext und verwandte Klassen nicht garantiert sind, Thread sicher. ",

"ExceptionType": "System.InvalidOperationException",

"StackTrace": 

bei System.Web.Http.ApiController.d__1.MoveNext ()

--- Ende des Stack-Trace von der vorherigen Position, an der die Ausnahme ausgelöst wurde

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task)

bei System.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebuggerNotification (Task> Task) 

at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext () "

39
Shaun Luttin

Das Problem war, dass wir NICHT das von MS empfohlene Fabrikmuster verwenden.

Sie können die Factory-Implementierung verwenden, um eine Instanz von UserManager .__ abzurufen. aus dem OWIN-Kontext. ... Dies ist eine empfohlene Methode, um eine Instanz von .__ zu erhalten. UserManager pro Anfrage für die Anwendung.

Daher wird "auf dieselbe Kontextinstanz von mehreren Threads gleichzeitig zugegriffen", da mehrere Anforderungen und somit Threads einen DbContext gemeinsam nutzen.

Das Folgende ist richtig. Es erstellt für jeden Aufruf der UserManagerFactory-Funktion eine neue Instanz von MyDbContext.

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

Folgendes ist falsch. Es sieht ähnlich aus, erstellt jedoch keine neue Instanz für jeden Aufruf von UserManagerFactory. Es ist das, was wir verwendet haben, also war unsere Website kaputt.

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

Dieser Fehler kann auch bei falscher connectionString auftreten. Prüfen Sie, ob connectionString gültig ist (kein Tippfehler usw.). 

24
Rafal Cypcer

Überschreiben Sie die OnModelCreating-Methode? Wenn ja, können Sie es oder die gesamte Kontextklasse teilen?

Wenn nicht, sollten Sie in der Fehlermeldung Folgendes beachten 

oder wenn auf dieselbe Kontextinstanz von mehreren Threads gleichzeitig zugegriffen wird. Beachten Sie, dass Instanzmitglieder von DbContext und verwandten Klassen nicht garantiert threadsicher sind.

Wenn dies nicht hilft, verwenden Sie ein unverändertes Web-API-Projekt, das von Visual Studio erstellt wird?

1
Horizon_Net

Wenn Sie Datensätze aus Tabelle/Ansicht erhalten, stellen Sie sicher, dass Sie ausreichend Zugriff auf die DB-Objekte haben.

Ich hatte das gleiche Problem und löste es durch Ausführen 

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


sp_change_users_login 'update_one' 'dbuser' 'dblogin'

Weitere Ausschnitte und Details finden

0
Raj kumar

Ich verwende EF Code First in einer mehrschichtigen Architektur mit MySQL, hatte die gleiche Ausnahme und verwendete die folgende Zeile innerhalb der DBContext-Klasse.

Database.SetInitializer<EntitiesName>(null);
0
Pedro C