Global.asax中DbContext的静态字段与控制器类中DbContext的实例字段的静态字段?

时间:2011-01-31 05:25:15

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

坦率地说,我是C#和Asp.net MVC的新手。 我也不知道asp.net Web应用程序是如何在场景后面的IIS和ASP.NET框架上实际工作的。

我对我必须在我的asp.net mvc应用程序中声明DbContext字段(或从DbContext派生的任何类)的决定感到困惑。

我有两个选择:

  1. 将字段声明为global.asax内的静态字段,以便所有控制器都可以使用它。
  2. 将字段声明为每个控制器类中的实例字段。
  3. 你能解释哪一个是正确的吗?确实需要更详细的解释。

2 个答案:

答案 0 :(得分:8)

如果你在global.asax中创建一个静态字段,你将遇到并发问题。来自多个请求的多个线程可以进入并获取彼此的数据。更糟糕的是,除非您开始在您的网站上获得更多流量,或者直到您开始加载测试,否则不会显示此信息。你将它作为一个单独实现,所有都将在你的测试中运行良好,你会想,“我是一个天才!看看这个实现是多么干净!”但总有一天,你会像往常一样被这个烧毁。结果将变得混乱,用户将开始看到不属于他们的数据,并且网站将出现意外行为。

Entity Framework和LINQ to SQL的上下文类都设计为轻量级实例化,您可以为要运行的每组查询设置。这并不意味着长寿。

Check out this other Stack Overflow question / answer on the same topic, worded differently.

答案 1 :(得分:4)

你应该选择第二个选项。即在控制器中声明并使用它。如果将DBContext作为静态字段放在global.asax中,那么基本上它就是整个应用程序的单个实例。

另一方面,使用第二个选项,每个请求都有一个DBcontext。如果您可以使用依赖注入来获取每个操作方法中的DBContext,那会更好。