在控制器中創建EF Core DBContext以進行多線程處理?

c# entity-framework-core

在我的一個控制器中,我有一個異步方法,必須同時進行幾個db調用,所以我這樣設置:

public xxxController(IConfiguration configuration, xxxContext xxxContext, xxx2Context xxx2Context)
   : base(xxxContext)

我存儲了注入的上下文。在特定方法中:

var v = await Task.WhenAll(... )

在WhenAll裡面,我需要為每個項使用xxxContext,所以我得到了非線程安全的異常。

創建新DbContext的正確方法是什麼?現在我正在做:

var v = new DbContextOptionsBuilder<xxxContext>();   
v.UseSqlServer(_xxxContext.Database.GetDbConnection().ConnectionString);    
xxContext e = new xxContext(v.Options);

所以我從注入的現有上下文中獲取連接字符串,並使用它創建一個新的連接字符串。

連接字符串存儲在appSettings.json中。在“ConnectionStrings”部分中。

是否有更簡潔的方法來創建多線程的上下文?

熱門答案

為此我創建了類似工廠類的東西,它可以為每個調用提供上下文。對於你的情況,它可以

public class AppDependencyResolver
{
    private static AppDependencyResolver _resolver;

    public static AppDependencyResolver Current
    {
        get
        {
            if (_resolver == null)
                throw new Exception("AppDependencyResolver not initialized. You should initialize it in Startup class");
            return _resolver;
        }
    }

    public static void Init(IServiceProvider services)
    {
        _resolver = new AppDependencyResolver(services);
    }

    private readonly IServiceProvider _serviceProvider;

    private AppDependencyResolver(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public xxxContext CreatexxxContextinCurrentThread()
    {
        var scopeResolver = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope();
        return scopeResolver.ServiceProvider.GetRequiredService<xxxContext>();
    }
}

你應該在Startup中調用Init方法

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    AppDependencyResolver.Init(app.ApplicationServices);
    //other configure code
}

您可以在github上查看我的方法



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow