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

LaT*_*TeX 5 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. 将该字段声明为每个控制器类中的实例字段.

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

Daw*_*oth 8

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

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

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