web-dev-qa-db-ja.com

「モデルの作成中はコンテキストを使用できません」ASP.NET Identityの例外

AccountApiController.Register()メソッドを呼び出したときにこれが発生するのはなぜですか?

  • コンテキストを使用しようとしているのは何ですか?
  • コンテキストを作成しようとしているのは何ですか?
  • どうすればこれを回避できますか?
  • これをどのようにデバッグしますか?

「メッセージ」:「エラーが発生しました。」、

"ExceptionMessage": "モデルの作成中はコンテキストを使用できません。OnModelCreatingメソッド内でコンテキストが使用される場合、または複数のスレッドが同じコンテキストインスタンスに同時にアクセスする場合、この例外がスローされる場合があります。および関連クラスはスレッドセーフであるとは限りません。 "、

"ExceptionType": "System.InvalidOperationException"、

"スタックトレース":"

system.Web.Http.ApiController.d__1.MoveNext()で

---例外がスローされた以前の場所からのスタックトレースの終了

system.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスクタスク)

system.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebuggerNotification(Task> task)で

system.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()で

42
Shaun Luttin

問題は、工場出荷時のパターン 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;
24
Shaun Luttin

このエラーは、connectionStringが正しくない場合にも発生する可能性があります。 connectionStringが有効かどうかを確認します(入力ミスなどはありません)。

26
Rafal Cypcer

OnModelCreatingメソッドをオーバーライドしますか?その場合、それまたはコンテキストクラス全体を共有できますか?

そうでない場合は、エラーメッセージで次の点に注意する必要があります。

または、同じコンテキストインスタンスが複数のスレッドによって同時にアクセスされる場合。 DbContextのインスタンスメンバーと関連クラスは、スレッドセーフであるとは限りません。

それでも解決しない場合は、Visual Studioで作成された未変更のWeb APIプロジェクトを使用しますか?

1
Horizon_Net

テーブル/ビューからレコードを取得する場合は、DBオブジェクトに十分なアクセス権があることを確認してください。

私は同じ問題を抱えていて、実行して解決しました

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


sp_change_users_login 'update_one' 'dbuser' 'dblogin'

スニペットと詳細を見つける

0
Raj kumar

MySQLの多層アーキテクチャでEF Code Firstを使用していますが、同じ例外があり、DBContextクラス構造内で次の行を使用しています。

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