Entity Framework 核心 1.0 DbContext 的范围不限于 http 请求

Entity Framework Core 1.0 DbContext not scoped to http request

通过与罗文·米勒 (Rowan Miller) 一起观看此视频,我明白了 https://channel9.msdn.com/Series/Whats-New-with-ASPNET-5/06 (第 22 分钟)Startup.cs 中将 Entity Framework Core(以前称为 EF7)配置为 ASP.NET Core 1.0 应用程序(以前称为 ASP.NET 5)的方法如下:

    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 实例确实是相同的,但如此处所述: 我正在尝试将以下中间件插入管道,以在控制器完成执行后实现某种集中式 Commit/Rollback:

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 的范围仅限于 http 请求仅在 MVC 执行的生命周期内(也许 MVC 负责处理 DbContext) ,因此管道中之前或之后的任何中间件都不会注入相同的 DbContext 实例。

然后我决定向 MVC 6 添加一个全局过滤器(因为过滤器是 MVC 框架的一部分),这样我就可以在操作执行前后访问同一个 DbContext 实例.

如果有人对如何创建此全局过滤器检查感兴趣: