在类构造函数中创建实体上下文?或者在需要使用时创建它

本文关键字:创建 构造函数 实体 上下文 或者 | 更新日期: 2023-09-27 18:24:56

我正在做一个别人开发的项目。在该项目中,它有

public class HomeController : Controller
{
    public HomeController() {
        _EntitiesContext = new EntitiesContext();
        _UsersContext = new UsersContext();
    }
    public UsersContext _UsersContext { get; set; }
    public EntitiesContext _EntitiesContext { get; set; }
    ......

然后,每当需要查询时,它都会使用这些上下文。

通常,我所做的是:我不在HomeController()中创建这些上下文,而是通过使用…创建它们语法。我认为它会打开连接,进行查询,然后关闭连接。否则,连接将始终打开。如果太多人使用它,可能会产生问题。

我说得对吗?我想我以前在网上读过这个,但现在找不到了。

感谢

在类构造函数中创建实体上下文?或者在需要使用时创建它

我认为它会打开连接,进行查询,然后关闭连接。

不太对。ADO.NET使用connection pool。因此,与数据库的实际连接并没有打开,而是从连接池中提取的。当您对DbContext调用Dispose时,它不会关闭连接。它只是将其返回到池中,以便以后可以重用。因此,不要害怕将DbContext实例包装在using语句中。

通常的做法是为每个HTTP请求创建一个上下文,然后在任何需要的地方使用相同的上下文。

实现它的最可行方法是注入EntitiesContext依赖项(传统上使用构造函数),而在配置的对象生命周期内为您注入它的最简单方法是使用IoC容器。

例如(使用Microsoft Unity):

public HomeController(EntitiesContext context) {
    _EntitiesContext = context;
}

容器配置(应用程序初始化时):

container.RegisterType<EntitiesContext>(new PerHttpRequestLifetime());