Entity Framework Core 1.0 DbContext не ограничен запросом http
Я понял, посмотрев это видео с Роуэн Миллерhttps://channel9.msdn.com/Series/Whats-New-with-ASPNET-5/06 (на 22 минуте) что способ настройки Entity Framework Core (ранее известный как EF7) в приложение 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 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 в моем Middleware не совпадает с экземпляром, внедряемым во время жизни MVC.
Это ожидается? Не должен ли DbContext быть ограничен запросом http? Возможно ли добиться того, чего я пытался добиться?
План B будет заключаться в использованииMVC 6 Глобальный фильтр (если я могу найти некоторую документацию о том, как это сделать). Я предполагаю, что будучи частью инфраструктуры MVC 6, внедренный экземпляр DbContext будет таким же.