.net core EFCore依赖项注入数据库连接寿命

.net core EFCore依赖项注入数据库连接寿命,.net-core,entity-framework-core,.net-core-3.1,.net Core,Entity Framework Core,.net Core 3.1,试图开始使用EFCore作为EF6的替代品,我很难理解在对我的DB上下文使用依赖注入时数据库生命周期是如何发生的 在EF 6中,我熟悉手动打开连接并通过使用语句利用其dispose方法。我似乎很清楚db生命周期是如何以这种方式反应的 (using var db = new DatabaseContext()) {} 有了EFCore,我知道推荐的方式是在我们的启动中添加db上下文类作为服务 services.AddDbContext<ApplicationDbContex

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

在EF 6中,我熟悉手动打开连接并通过使用语句利用其dispose方法。我似乎很清楚db生命周期是如何以这种方式反应的

(using var db = new DatabaseContext())
{}
有了EFCore,我知道推荐的方式是在我们的启动中添加db上下文类作为服务

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

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


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

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

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

AddDbContext扩展方法将DbContext类型注册为 默认情况下为生存期

在ASP.NET核心中,这是安全的,不会出现并发访问问题 应用程序,因为每个客户端只有一个线程执行 在给定的时间请求,因为每个请求都有一个单独的 依赖项注入范围(因此是一个单独的DbContext 实例)

但是,任何显式并行执行多个线程的代码 应确保从未访问过DbContext实例 同时


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

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

AddDbContext扩展方法将DbContext类型注册为 默认情况下为生存期

在ASP.NET核心中,这是安全的,不会出现并发访问问题 应用程序,因为每个客户端只有一个线程执行 在给定的时间请求,因为每个请求都有一个单独的 依赖项注入范围(因此是一个单独的DbContext 实例)

但是,任何显式并行执行多个线程的代码 应确保从未访问过DbContext实例 同时


因此,在MVC结构中,请求被路由到我正在注入服务的控制器:然后打开底层提供程序,并保持接受状态,直到我的请求上下文关闭(控制器返回)?谢谢你的快速回复。谢谢你的提问和回答。我对更好地理解这个过程也很感兴趣。在dotnetcoreapi中,通过依赖注入使用DbContext,我不需要手动关闭连接吗?因为它是通过注入传递的DbContext的一个实例,所以如果我在类方法中打开一个事务,即使我实例化不同的对象,连接也会是相同的吗?这取决于哪个事务API。您可能需要强制DbConnection在DbContext期间保持打开状态。具体细节因供应商而异。TransactionStope应该与所有提供商合作。根据您的具体情况提出一个新问题。因此,在MVC结构中,一个请求被路由到我正在注入服务的控制器:然后,底层提供程序被打开,并将保持接受状态,直到我的请求的上下文被关闭(控制器返回)?谢谢你的快速回复。谢谢你的提问和回答。我对更好地理解这个过程也很感兴趣。在dotnetcoreapi中,通过依赖注入使用DbContext,我不需要手动关闭连接吗?因为它是通过注入传递的DbContext的一个实例,所以如果我在类方法中打开一个事务,即使我实例化不同的对象,连接也会是相同的吗?这取决于哪个事务API。您可能需要强制DbConnection在DbContext期间保持打开状态。具体细节因供应商而异。TransactionStope应该与所有提供商合作。根据你的具体情况问一个新问题。
    private readonly ApplicationDbContext context;

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