跨多个HTTP请求的Ef Core DbContext跟踪

时间:2018-10-03 16:36:01

标签: c# .net-core ef-core-2.1

我在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. 在DbContext上运行SaveChangesAsync()

动作1 中所做的更改将被保留。如果我断开了 Action 1 中的任何关系,则会收到错误消息。

我知道默认情况下DbContext是作用域的。我是否必须实现一些自己的作用域代码以确保每个HTTP请求都获得一个新实例?

注意:我不使用MVC,而是使用自己正在开发的小库。我刚刚了解到MVC可能使用IServiceScopeFactory生成范围。我不确定如何在中间件中使用它。

1 个答案:

答案 0 :(得分:0)

我明白了。这是在中间件中使用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);
        }
    }
}