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

时间:2013-04-08 09:41:46

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

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

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

我是否必须自己调用Dispose()或者从GC安全地完成(如第二个答案中所述:Should Entity Framework Context be Put into Using Statement?)。

如果我决定使用静态类,是否有安全点来处置上下文变量(“应用程序的结尾”)?

我的静态类示例:

public static class ApplicationHelper
{
    static ApplicationHelper()
    {
        Db = new ApplicationEntities();
    }

    internal static readonly ApplicationEntities Db;
}

1 个答案:

答案 0 :(得分:2)

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

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

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