5

この質問に対する回答は見つかりませんでした。EFコアの複数のHTTP要求でエラーが発生する

フロントエンドでは、ユーザーがページを読み込むときに、そのページの各アイテム(10個のアイテム)ごとにAPIを呼び出します。つまり、10個のAPI呼び出しに相当します。

呼び出しの大部分は動作しますが、次のエラーが発生したデータベースを照会しようとすると失敗することは数が常にあります。

InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

は、今私は、Entity Frameworkはスレッドセーフではないことを理解しますが、私はわかりませんよこのエラーを回避する方法。

どこでも私はDBContextを使用していますが、これは常に組み込みの.netコアIocコンテナを使用して注入されます。ここで

は、DIの設定

services.AddScoped<IOmbiContext, OmbiContext>(); 
services.AddTransient<ISettingsRepository, SettingsJsonRepository>(); 

は私のリポジトリのすべては、この記事によるとScopedとしてコンテキストとTransient範囲に設定されている:https://docs.microsoft.com/en-us/aspnet/core/data/entity-framework-6

は今、私はTransientにコンテキストを変更しようとしていますそれはまだ起こります。

どうすればこの問題を回避できますか?

詳細情報

APIメソッド:

[HttpGet("movie/info/{theMovieDbId}")] 
public async Task<SearchMovieViewModel> GetExtraMovieInfo(int theMovieDbId) 
{ 
    return await MovieEngine.LookupImdbInformation(theMovieDbId); 
} 

最終的に例外がスローされている場合、次の呼び出します:

public async Task<RuleResult> Execute(SearchViewModel obj) 
{ 
    var item = await PlexContentRepository.Get(obj.CustomId); <-- Here 
    if (item != null) 
    { 
     obj.Available = true; 
     obj.PlexUrl = item.Url; 
     obj.Quality = item.Quality; 
    } 
    return Success(); 
} 

PlexContentRepository

public PlexContentRepository(IOmbiContext db) 
{ 
    Db = db; 
} 

private IOmbiContext Db { get; } 
public async Task<PlexContent> Get(string providerId) 
{ 
    return await Db.PlexContent.FirstOrDefaultAsync(x => x.ProviderId == providerId); <-- Here 
} 
+0

これが適用されますhttps://stackoverflow.com/questions/20628792/multi-async-in-entity-framework-6#20635076 – Nkosi

+0

@Nkosiいいえ、すべてがずっと使ってスタックダウン完全に非同期であります'async'と' await'キーワードです。 –

+1

エラーをスローするAPIを表示することができます – Nkosi

答えて

-2

あなたはEntity Frameworkのコアを使用する場合は通常、あなたが

は、私は、次のようStartup.csにセットアップするためにあなたのDbContextをお勧めします追加のサービスとしてあなたのデータベースコンテキストを追加する必要はありません。

services.AddEntityFrameworkSqlServer() 
      .AddDbContext<OmbiContext>(); 

続きますDBContextをコンストラクタパラメータとして使用するAPI呼び出しのControllerクラス。

public class ApiController : Controller 
{ 
    protected OmbiContext ctx; 
    public ApiController(OmbiContext dbctx) 
    { 
     ctx = dbctx; 
    } 

    public async Task<IActionResult> yourAsyncAction() 
    { 
     // access ctx here 
    } 
} 
+0

私はこれが本当に質問に答えるとは思わない。コントロールの責任の反転に続いて、ユニットテストを支援するためにコンテキストも注入されています –

+0

IMO - 質問者は、上記のエラーを引き起こす可能性のある第2のサービスを構築しています –

関連する問題