どのようにasp.netコアとef7の並列メソッドで注入DbContextを使用するには?

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

質問

私はAsp.net 5 / Core 1アプリケーションをEF7に持っています。私はDbContextをDIコンテナに通常登録します。

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(コア)を使用しています。 AddTransientのようなDBContextを作成する

誰かがよりエレガントなソリューションを提供できるなら、私は感謝します。時には私は実際には即座の結果をユーザに返す必要があり、そのような場合には/ asyncがうまくいかない


人気のある回答

簡単な答え:できません。 EFはパラレルSQLの実行のために作られていません(それは決してありません)。

簡単ではない答え。おそらくこれはあなたの問題にアプローチする正しい方法ではないでしょう(@ Tsengは彼のコメントの中でポイントを作っています)。しかし、あなたがそうしたログ記録をする必要があるなら、

  • 2つのロギングアクションを順次実行し、同じEFインスタンスを共有する
  • 単純な古いSQLをSqlConnectionオブジェクトで使用します(並列処理では完全に機能します)。
  • Log-and-forgetアプローチをサポートするNLogのようなロギングフレームワークを使用する


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ