Entity Framework Core 1.0 DbContextがHTTP要求にスコープされていない

asp.net-core-1.0 asp.net-core-mvc dbcontext entity-framework-core middleware

質問

私は、Rowan Millerのhttps://channel9.msdn.com/Series/Whats-New-with-ASPNET-5/06 (分22)でこのビデオを見て、Entity Framework Core(旧EF7 )をStartup.cs ASP.NET Core 1.0アプリ(以前はASP.NET 5と呼ばれていた)にStartup.csは次のとおりです。

    public void ConfigureServices(IServiceCollection services)
    {
        //Entity Framework 7 scoped per request??
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options
                  .UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
            });

        //MVC 6
        services.AddMvc();
    }

このDbContextはHTTPリクエストにスコープされるため、httpパイプライン(ミドルウェアまたはMVCを含む)のコード内でDbContextが使用されるたびに、DIコンテナによって注入されるインスタンスが同じであることがわかります。

しかし問題は、それがそのように働くようには見えないということです。 MVCの存続期間内に、注入されたDbContextインスタンスは同じですが、ここで説明したとおりです: Entity Frameworkコア1.0 Asp.NetコアミドルウェアまたはMvcフィルタの作業単位パイプラインに次のミドルウェアを接続しようとしています。コントローラが実行を終了した後、一種の集中型コミット/ロールバックを実現する:

public class UnitOfWorkMiddleware
{
    private readonly RequestDelegate _next;
    private readonly MyDbContext _dbContext;
    private readonly ILogger _logger;

    public UnitOfWorkMiddleware(RequestDelegate next, MyDbContext dbContext, ILoggerFactory loggerFactory)
    {
        _next = next;
        _dbContext = dbContext;
        _logger = loggerFactory.CreateLogger<UnitOfWorkMiddleware>();
    }

    public async Task Invoke(HttpContext httpContext)
    {
        await _next.Invoke(httpContext);
        _logger.LogInformation("Saving changes for unit of work if everything went good");
        await _dbContext.SaveChangesAsync();
    }
}

このミドルウェアはパイプラインのMVC6の直前にあります

//inside Configure(IApplicationBuilder app) in Startup.cs
app.UseMiddleware<UnitOfWorkMiddleware>();
app.UseMvcWithDefaultRoute();

ミドルウェアのDbContextインスタンスは、MVCライフタイム中に注入されるインスタンスと同じではありません

これは期待されていますか? DbContextをHTTPリクエストのスコープにするべきではありませんか?達成しようとしていたことを達成することは可能ですか?

プランBは、 MVC 6グローバルフィルタを使用することです(もし私がこれを行う方法に関するいくつかの文書を見つけることができれば)。私は、MVC 6フレームワークの一部であると仮定し、注入されたDbContextインスタンスは同じになります。

受け入れられた回答

より多くのテストを行った後、DbContextはMVC実行の存続期間中にのみ HTTP要求にスコープされることが確認できます(MVCはDbContextの処理を担当している可能性があります)。そのため、パイプラインの前後のミドルウェアは、 DbContextの同じインスタンスが挿入されます。

その後、アクションの実行の前後に同じDbContextインスタンスにアクセスできるように、フィルタがMVCフレームワークの一部であるため、MVC 6にグローバルフィルタを追加することにしました。

誰かがこのグローバルフィルタチェックの作成方法に興味がある場合: Asp.Net CoreミドルウェアまたはMvcフィルタを使用したEntity Framework Core 1.0作業単位



Related

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