EFCore 依赖注入数据库连接寿命

EFCore Dependency Injection Database Connection lifespan

尝试开始使用 EFCore 作为 EF 6 的替代品,但我很难理解在对我的数据库上下文使用依赖项注入时数据库生命周期是如何发生的。

在 EF 6 中,我熟悉手动打开连接并通过 using 语句利用其 dispose 方法。对我来说,数据库生命周期如何以这种方式做出反应似乎很清楚。

(using var db = new DatabaseContext())
{}

使用 EFCore,我了解推荐的方式是将数据库上下文 class 添加为我们启动时的服务

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

然后通过依赖注入获取controller中的context

    private readonly ApplicationDbContext context;

    public HomeController(ApplicationDbContext context, ILogger<HomeController> logger)
    {
        this.context = context;
    }

这样,连接池什么时候开始?我的连接何时打开,此连接的生命周期是多长?它是否在应用程序启动时打开连接并在停止时关闭?当点击控制器方法时(如果使用 mvc)它会打开吗?什么时候主动查询?

当 SF Core 2.0 文档引入 DBContext 池时,我确实找到了一个简短的参考,它暗示了幕后发生的事情。

"The basic pattern for using EF Core in an ASP.NET Core application usually involves registering a custom DbContext type into the dependency injection system and later obtaining instances of that type through constructor parameters in controllers. This means a new instance of the DbContext is created for each requests."

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-2.0

这是否意味着对于进入我的控制器的默认请求,无论我是否使用它,数据库上下文都会在请求管道中打开?假设返回请求时关闭。

有人可以帮助我了解使用此模式时的数据库连接寿命吗?如果这是一个重复的问题,请帮助标记并指出我可以详细阅读的地方。我花了一些时间进行研究,但似乎我能找到的所有文章都掩盖了这一点,否则我可能会使用错误的关键字进行搜索。

默认情况下,将为每个 HTTP 请求创建并使用单个 DbContext。在 DbContext 的生命周期内可以多次打开和关闭连接,但如果 DbContext 启动事务,则相同的底层连接将保持打开状态并在事务的生命周期内重复使用。

创建 DbContext 时,它不会立即初始化,也不会立即打开连接。

The AddDbContext extension method registers DbContext types with a scoped lifetime by default.

This is safe from concurrent access issues in ASP.NET Core applications because there is only one thread executing each client request at a given time, and because each request gets a separate dependency injection scope (and therefore a separate DbContext instance).

However any code that explicitly executes multiple threads in parallel should ensure that DbContext instances aren't ever accessed concurrently.

Implicitly sharing DbContext instances across multiple threads via dependency injection