DbContext是一项昂贵的操作吗?

时间:2015-08-29 05:23:03

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

在C#MVC EF框架中,我看到很多例子只需要在需要插入或查询时创建一个新的DbContext,然后关闭/释放它(许多人使用"使用"用于自动关闭/释放)。

对此进行了一些搜索,但无法找到一个好的答案,但却创建了一个非常便宜且快速的DbContext操作?

例如,考虑一个典型的MVC应用程序,在页面上它有许多组件,例如标题,边栏,主要内容等,并且在非平凡的设置中,每个组件将有自己独立的逻辑和代码 - 我想在每个组件中创建一个新的DbContext吗? (如果是,系统会自动缓存查询结果吗? - 例如,一个常见的用例是,在每个组件中,它需要在数据库中查询当前站点范围的设置,这是同一行中的表)。

2 个答案:

答案 0 :(得分:13)

如“Performance Considerations for Entity Framework 4, 5 and 6”第9.3节(强调我的)所述:

  

实体框架的上下文旨在用作短期实例,以提供最佳的性能体验。 上下文应该是短暂的并且被丢弃,因此已经被实现为非常轻量级并且尽可能地重用元数据。在Web方案中,重要的是要记住这一点,并且不要有超过单个请求持续时间的上下文。同样,在非Web方案中,应根据您对实体框架中不同级别的缓存的理解来丢弃上下文。 一般来说,应该避免在应用程序的整个生命周期中都有一个上下文实例,以及每个线程和静态上下文的上下文

答案 1 :(得分:1)

您可以使用注入,例如通过Unity,这将允许在请求进入时创建单个DbContext实例并将其注入需要的位置。使用Unity,我相信您可以指定是为每个请求创建单个实例,还是每次都创建一个新实例。

在任何需要的地方创建DbContext并不是很慢,但是这有一点常识,所以如果可以的话,重新使用已有的,如果你专注于与数据库查询相关的性能,那么就会始终是使用任何ORM的开销。这是一个方便的权衡。

我还建议使用像Glimpse这样的东西,它允许您查看用于渲染页面的所有查询和连接,包括ajax查询,并为您提供有关正在发生的事情的精彩概述。有时可能有点吓人!