5

Nie mogę znaleźć odpowiedzi na to pytanie.EF Wiele rdzenia HTTP żąda błędu

Tak więc w interfejsie użytkownika, gdy użytkownik ładuje stronę, nazywamy API dla każdego elementu na tej stronie (10 pozycji). Oznacza to 10 wywołań API.

Większość połączeń pracować, ale zawsze istnieje kilka, które nie próbując kwerendy bazy danych wynikającą w następujący błąd:

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

Teraz rozumiem, że Entity Framework nie jest wątku bezpieczne, ale jestem pewien, jak obejść ten błąd.

Wszędzie tam, gdzie korzystam z DBContext, zawsze jest on wstrzykiwany za pomocą wbudowanego głównego kontenera Ioc .net.

Oto konfiguracja DI

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

Wszystkie moje repozytoria są ustawione w Transient zakresie z kontekstem jako Scoped Zgodnie z tym artykułem: https://docs.microsoft.com/en-us/aspnet/core/data/entity-framework-6

Teraz próbowałem zmieniając kontekst Transient i tak się dzieje.

Jak mogę tego uniknąć?

Więcej informacji

Metoda API:

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

który ostatecznie wywołuje następujące gdzie wyjątek jest wyrzucane:

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

Czy dotyczy to https://stackoverflow.com/questions/20628792/multi-async-in-entity-framework-6#20635076 – Nkosi

+0

@Nkosi Nie, wszystko jest w pełni asynchroniczne w dół stosu przy użyciu słowa kluczowe "async" i "czekaj". –

+1

Czy jesteś w stanie pokazać wywoływane API, które zgłasza błąd? – Nkosi

Odpowiedz

-2

Jeśli używasz Entity Framework Rdzeń zwykle nie trzeba dodać kontekstu bazy danych jako usługę dodatkową

polecam sposób skonfigurować DbContext w Startup.cs następująco:

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

Obserwowani przez klasa Controller dla twoich wywołań API pobierająca parametr konstruktora DBContext jako.

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

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

Nie sądzę, że to naprawdę odpowiada na pytanie. Kontekst został również wprowadzony w celu wspomagania testów jednostkowych po odwróceniu odpowiedzialności za kontrolę. –

+0

IMO - Pytający buduje drugą usługę, która może spowodować wspomniany błąd –