Ef Core DbContext отслеживание нескольких HTTP-запросов - PullRequest
0 голосов
/ 03 октября 2018

У меня есть своя собственная простая структура для маршрутизации / контроллеров в C # и .NET Core.Я использую EF Core для ORM.В Startup.cs я настраиваю его так:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<Context>(options =>
        {

            options.EnableSensitiveDataLogging();
            options.UseSqlServer(System.Environment.GetEnvironmentVariable("SQL_SERVER_CONNECTION"));
        });
    }

Я использую внедрение зависимостей, чтобы получить экземпляр моего DbContext.В своих действиях контроллера я делаю следующее:

Действие 1 :

  1. Не используйте AsNoTracking() в моих запросах
  2. Вносите измененияв экземпляр модели
  3. Не сохранять изменения

Действие 2 (другой HTTP-запрос) :

  1. Делать буквально что угодно
  2. Выполнить SaveChangesAsync() для DbContext

Изменения, сделанные в Действие 1 , сохраняются.Если я разорвал какие-либо отношения в Action 1 , я получаю сообщение об ошибке.

Я знаю, что по умолчанию DbContext ограничен.Нужно ли мне реализовывать свой собственный код области видимости, чтобы получать новый экземпляр с каждым HTTP-запросом?

ПРИМЕЧАНИЕ. Я НЕ использую MVC, я использую собственную небольшую библиотеку, которую разрабатываю,Я только что узнал, что MVC, вероятно, использует IServiceScopeFactory для генерации областей.Я не уверен, как использовать его в промежуточном программном обеспечении, хотя.

1 Ответ

0 голосов
/ 03 октября 2018

Я понял.Вот как обернуть область с помощью HttpContext в промежуточном программном обеспечении:

public class Middleware
{
    private readonly RequestDelegate _next;
    private IServiceScopeFactory _scopeFactory;

    public Middleware(RequestDelegate next, IServiceScopeFactory scopeFactory)
    {
        _next = next;
        _scopeFactory = scopeFactory;
    }

    public async Task Invoke(HttpContext context)
    {
        using (var scope = _scopeFactory.CreateScope())
        {
            context.RequestServices = scope.ServiceProvider;
            // Do whatever you want here
            if (_next != null)
                await _next(context);
        }
    }
}
...