質問: $"test_{Guid.NewGuid().ToString()}" }); } } ``` **私が気づいたこと** * Entity FrameworkプロバイダーをSqlServerからSqliteに変更すると、エラーは表示されません。 **システム情報** * ASP.NET Core 3.1.0 Blazorサーバー側 * SqlServerプロバイダーに基づくEntity Framework Core 3.1.0 **私がすでに見たもの** * 前の操作が完了する前にBlazor Aは、第2の操作この文脈で開始 :私はまだのUserManagerの同じインスタンスを使用して*スコープ*からの*過渡*私に私のDbContextの範囲を変更した場合でもので、提案された解決策は、私のために仕事をせず、そのは、同じインスタンスが含まれていますDbContext * StackOverflowの他の人たちは、リクエストごとにDbContextの新しいインスタンスを作成することを提案しています。依存性注入の原則に反するため、このソリューションは好きではありません。とにかく、DbContextがUserManager内にラップされているため、このソリューションを適用できません。 * DbContextのジェネレータを作成します 。このソリューションは前のソリューションと非常によく似ています。 * Entity Framework CoreをBlazorで使用する **IQueryableを使用する理由** IQueryableをクエリに直接ページ付けとフィルタリングを適用できるため、サードパーティのコンポーネントのデータソースとしてIQueryableを渡したいと思います。さらに、IQueryableはCUD操作に敏感です。
回答: 一般的な解決策 Daniel Roth BlazorDeskShow-2:24:20にこの問題について尋ねましたが、これはBlazor **サーバー側の**問題のようです。 DbContextデフォルトの寿命はに設定されている`Scoped`各構成要素の寿命として。したがって、 **非同期**クエリを実行しようとしている同じページに少なくとも2つのコンポーネントがある場合、例外が発生します。 > InvalidOperationException:前の操作が完了する前に、このコンテキストで2番目の操作が開始されました。インスタンスメンバーは、スレッドセーフであるとは限りません。 > > この問題には次の2つの*回避策*があります。 * (A)DbContextの存続時間を*一時に*設定する ``` services.AddDbContext(opt => opt.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient); ``` * (B)カールフランクリンが提案したとおり(私の質問の後に): `DbContext`新しいインスタンスを返す静的メソッドを使用してシングルトンサービスを作成します。 とにかく、 `DbContext`新しいインスタンスを作成するため、各ソリューションは`DbContext`ます。 私の問題について 私の問題は、厳密に関連していなかった`DbContext`けどで`UserManager`持っている`Scoped`寿命を。 DbContextのライフタイムを`Transient`設定しても問題は解決しませんでした`UserManager`が初めてセッションを開いたときに`UserManager`新しいインスタンスを作成し、それを閉じたりBlazorページを変更したりしない限り存続します。この`UserManager`は、同じページの2つのコンポーネント内にあります。次に、前に説明したのと同じ問題があります。 * 一時的な`DbContext`を含む同じ`UserManager`オブジェクトを所有する2つのコンポーネント。 現在、私は別の回避策でこの問題を解決しました: * 代わりに`UserManager`直接使用せず、 `IServiceProvider`を使用してそのインスタンスを新規作成し、機能します。 `IServiceProvider`を使用する代わりに、 まだUserManagerのライフタイムを変更するメソッドを探しています。 > ヒント:サービスの寿命に注意を払う > > これは私が学んだことです。それがすべて正しいかどうかはわかりません。