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

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

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

我有两个选择:

  1. 将该字段声明为global.asax的静态字段,以便所有控制器都可以使用它。
  2. 将该字段声明为每个控制器类中的实例字段。

你能解释哪一个是正确的吗? 确实需要更详细的解释。

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

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

查看关于同一主题的其他Stack Overflow问题/答案,措辞不同。

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

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