如何在asp.net core和ef7中的並行方法中使用注入的DbContext?

asp.net-core c# dependency-injection entity-framework-core

我有一個EF7的Asp.net 5 / Core 1應用程序。我通常在DI容器中註冊DbContext。

services.AddEntityFramework().AddSqlServer()
  .AddDbContext<MyDbContext>(options => options.UseSqlServer(connection));

這是一個小樣本,展示了我正在嘗試做的事情。

public class MyController : Controller
{
    MyDbContext _myDbContext;

    public MyController(MyDbContext myDbContext)
    {
        _myDbContext = myDbContext;
    }

    public IActionResult Index()
    {
        //Just start these and don't wait for them to finish
        //We don't care if they succeed or not
        Task.Run(() => DoSomeLogging1());
        Task.Run(() => DoSomeLogging2());

        return View();
    }

    private void DoSomeLogging1()
    {
        _myDbContext.Items.ToList();
    }

    private void DoSomeLogging2()
    {
        _myDbContext.Items.ToList();
    }
}

兩個DoSomeLoggingX方法都將使用注入控制器的MyDbContext實例。由於這些方法同時運行db查詢,另一個方法總是會失敗

連接沒有關閉。連接的當前狀態是連接。

MyDbContext也使用DI來獲取一些引用,所以即使我想要也不能直接使用它。

如何並行運行代碼並仍然能夠通過實體框架使用我的數據庫?

一般承認的答案

我也遇到了這個問題,現在我使用我的臨時解決方案EF 7(Core)。像AddTransient一樣創建DBContext

如果有人能提供更優雅的解決方案,我將不勝感激。有時我真的需要將即時結果返回給用戶,在這種情況下,await / async不適合


熱門答案

簡單回答:你做不到。 EF不是為並行sql執行而做的(我想也永遠不會)。

不太簡單的答案。可能這不是解決問題的正確方法(@Tseng在他的評論中提到了一點),但是如果你需要做類似的日誌記錄,你可以:

  • 使兩個日誌記錄操作順序並共享相同的EF實例
  • 使用普通的舊SQL和SqlConnection對象(它與並行處理完美配合) - 而且速度更快
  • 使用像NLog這樣的日誌記錄框架,它支持log-and-forget方法


Related

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