Web表单 - Entity Framework上下文处理

4
我有一个使用Entity Framework管理与MySQL数据库交互的.NET 4 Web应用程序(Web Forms)。在每个页面加载时,我都会创建该模型的上下文。
 string connString = ConfigurationManager.ConnectionStrings["dbconnection"].ToString();
 MyModel = new MyEntities(connString);

现在,在页面上的后续操作中,我可以使用MyModel来检索和更新数据。这对我来说很干净简单,但我一直认为当进行新页面请求时,.NET会丢弃之前页面的MyModel。我意识到这可能不是事实?内存可能被使用效率低下。
我已经看到有人充分论证了将`using (MyEntities MyModel = new MyEntities(ConfigurationManager.ConnectionStrings["dbconnection"].ToString()))`纳入其中的案例,该语句用于处理处置,但如果我在页面上有6个以上的操作需要每次调用时重新创建上下文,则此方法似乎并不干净(尽管我的当前方法也不好)。
是否有一种干净的方式可以在初始页面加载时创建上下文,并在调用新页面、非回发或用户会话结束时将其处置?
2个回答

5
你可以覆盖 System.Web.UI.Control 的虚拟 Dispose 方法,并在其中处理你的上下文:
public override void Dispose()
{
  if (MyModel != null)
    MyModel.Dispose();
  base.Dispose();
}

此外,您可以通过按需创建的上下文将 MyModel 转换为属性:
private MyEntities fMyModel = null;

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

然后,在Dispose方法中使用该字段:
public override void Dispose()
{
  if (fMyModel != null)
    fMyModel.Dispose();
  base.Dispose();
}

此外,您可以创建一个基本的 Page 类,并使用上述属性和 Dispose 重写来继承您的页面 - 这样您就不需要在所有页面中重复此代码。

我喜欢这个概念,它仍然干净且可重复使用。我需要创建一些测试来验证我脑海中的过程。回应很棒! - CodeMonkeyMI

0
最简单的方法是在页面的 Unload 事件中对数据上下文添加一个 Dispose() 方法的调用。
protected void Page_Unload(object sender, EventArgs e)
{
    MyModel.Dispose();
}

我认为更好的方式是在Web应用程序中使用默认值(无论是WebForms还是MVC),即每个请求创建一个数据上下文,并在请求结束时将其释放。要轻松实现这一点,您可以使用IoC容器框架,例如Ninject。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接