Web表单 - 实体框架上下文处理

Cod*_*yMI 4 c# asp.net entity-framework memory-management

我有一个.NET 4 Web应用程序(Web窗体),它使用Entity Framework来管理MySQL数据库的数据.对于每个页面,我在Page_Load中为此模型创建上下文.

 string connString = ConfigurationManager.ConnectionStrings["dbconnection"].ToString();
 MyModel = new MyEntities(connString);
Run Code Online (Sandbox Code Playgroud)

现在,在页面上的后续操作中,我可以使用MyModel来检索和更新数据.这对我来说简洁明了,但我总是假设.NET在发出新的页面请求时丢弃了之前的Page的MyModel.我意识到情况可能不是这样吗?和记忆可能被低效使用.

我已经看到了一个很好的案例,用于合并using (MyEntities MyModel = new MyEntities (ConfigurationManager.ConnectionStrings["dbconnection"].ToString()))句柄处理,但如果我在页面上有6个以上的操作,每个需要在调用时重新创建上下文(不是我当前的方法做得更好),这似乎并不干净.

是否有一种干净的方法可以在初始页面加载时创建一次上下文,并在调用新页面,调用非回发或用户会话结束时处置它?

Igo*_*gor 5

您可以覆盖DisposeSystem.Web.UI.Control的虚方法并在那里处理您的上下文:

public override void Dispose()
{
  if (MyModel != null)
    MyModel.Dispose();
  base.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以MyModel根据需要创建具有上下文的属性:

private MyEntities fMyModel = null;

protected MyEntities MyModel
{
  get
  {
    if (fMyModel == null)
    {
      string connString = ConfigurationManager.ConnectionStrings["dbconnection"].ToString();
      fMyModel = new MyEntities(connString);
    }
    return fMyModel;
  }
} 
Run Code Online (Sandbox Code Playgroud)

然后,在Dispose与该领域的工作:

public override void Dispose()
{
  if (fMyModel != null)
    fMyModel.Dispose();
  base.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以Page使用上述属性创建基类,并Dispose覆盖并继承您的页面 - 然后您无需在所有页面中重复此代码.