實體框架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 分鐘) ,了解實體框架核心(以前稱為EF7)的方式)在Startup.cs的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實例是相同的,但如下所述: Entity Framework Core 1.0與Asp.Net Core中間件或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 Global過濾器 (如果我能找到一些關於如何執行此操作的文檔)。我假設作為MVC 6框架的一部分,注入的DbContext實例將是相同的..

一般承認的答案

經過更多測試後,我可以確認DbContext 僅在MVC執行的生命週期內確定範圍為http請求(也許MVC負責處理DbContext),因此管道之前或之後的任何中間件都不具備注入了相同的DbContext實例。

然後我決定向MVC 6添加一個全局過濾器 (因為過濾器是MVC框架的一部分),這樣我就可以在動作執行之前和之後訪問相同的DbContext實例。

如果有人對如何創建此全局篩選器檢查感興趣: 使用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合法嗎? 是的,了解原因