我正在使用实体框架开发一个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;
}
答案 0 :(得分:2)
上下文不被认为是线程安全的,因此将它置于静态变量中可能是一个坏主意。此外,GC可能会在您想要的时候在您的上下文中调用dispose,在将来可能所有连接都用尽之后的某个遥远点。换句话说,显式调用Dispose。这通常使用using()
语句来完成。
总而言之,您应该使用DI容器来注入上下文并以此方式管理连接的生命周期,实现工作单元模式,该模式将通过存储库模式管理上下文生存期,或者显式打开和在控制器的操作方法中关闭连接。
public ActionResult SomeAction()
{
using( var db = new ApplicationEntities() )
{
//todo: use db
}
return View();
}