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
}
Czy dotyczy to https://stackoverflow.com/questions/20628792/multi-async-in-entity-framework-6#20635076 – Nkosi
@Nkosi Nie, wszystko jest w pełni asynchroniczne w dół stosu przy użyciu słowa kluczowe "async" i "czekaj". –
Czy jesteś w stanie pokazać wywoływane API, które zgłasza błąd? – Nkosi