在静态类或具体类中保存所有视图的上下文

本文关键字:视图 上下文 保存 静态类 | 更新日期: 2023-09-27 18:07:55

我正在使用实体框架开发asp.net MVC4应用程序。

我应该在静态类中保存实体的上下文,以便只有一个点可以创建上下文,还是应该在每个控制器中创建上下文?

我必须自己调用Dispose()还是从GC安全地完成(就像在这里的第二个答案中所说的:实体框架上下文应该放入Using语句中吗?).

如果我决定使用静态类,是否有一个安全点来处理上下文变量("应用程序的结束")?

静态类的例子:
public static class ApplicationHelper
{
    static ApplicationHelper()
    {
        Db = new ApplicationEntities();
    }
    internal static readonly ApplicationEntities Db;
}

在静态类或具体类中保存所有视图的上下文

上下文不被认为是线程安全的,因此将其放在静态变量中可能是一个坏主意。此外,在将来某个遥远的时刻,可能在您的所有连接都用完之后,当GC需要时,它会为您调用对上下文的dispose。换句话说,显式调用Dispose。这通常使用using()语句完成。

总而言之,你应该使用一个DI容器注入你的上下文,并以这种方式管理连接的生命周期,实现一个工作单元模式,它将通过存储库模式管理上下文的生命周期,或者在控制器的操作方法中显式地打开和关闭你的连接。

public ActionResult SomeAction()
{
 using( var db = new ApplicationEntities() )
 {
  //todo: use db
 }
 return View();
}