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个以上的操作,每个需要在调用时重新创建上下文(不是我当前的方法做得更好),这似乎并不干净.
是否有一种干净的方法可以在初始页面加载时创建一次上下文,并在调用新页面,调用非回发或用户会话结束时处置它?
您可以覆盖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覆盖并继承您的页面 - 然后您无需在所有页面中重复此代码.