5

我似乎无法找到此问题的答案。EF核心多个HTTP请求会引发错误

因此,在用户加载页面的前端,我们调用该页面上每个项目的API(10项)。这等于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.

现在我明白了实体框架是不是线程安全的,但我不确定如何解决这个错误。

无处不在我使用DBContext它始终注入使用内置.net核心Ioc容器。

这里是DI设置

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

我所有的仓库根据这篇文章是在Transient范围与上下文为Scoped设置: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

如果您使用实体框架的核心通常你不需要添加数据库上下文作为附加服务

我建议设置你的DbContext在Startup.cs如下:

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

其次为您的API调用使用DBContext作为构造函数参数的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 - 提问者正在建立第二个服务,可能会导致错误提及 –