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

时间:2014-09-28 18:01:03

标签: c# asp.net asp.net-mvc entity-framework lifetime

我正在开展其他人开发的项目。在项目中,它有

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

    ......

然后,只要需要查询,它就会使用这些上下文。

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

我对此是否正确?我想我以前在网上看过这个,但是再也找不到了。

由于

2 个答案:

答案 0 :(得分:0)

  

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

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

答案 1 :(得分:0)

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

实现它的最可行的方法是注入EntitiesContext依赖项(传统上使用构造函数),并使用配置的对象为您注入它的最简单方法生命周期使用{{3 }}

例如(使用Microsoft Unity):

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

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

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