虽然这不是一个新问题,但我仍然要发布我的答案,因为我相信可能有人会发现它有用。
像许多其他人一样,我按照接受的答案中提到的步骤进行操作。耶,它起作用了。然而,这里有一个问题:
BeginRequest()
和EndRequest()
方法每次发出请求时都会触发,但不仅限于aspx页面,还包括所有静态内容!也就是说,如果您使用上面提到的代码,并且在您的页面上有30个图像,您将重新实例化您的数据库上下文30次!
解决办法是使用一个包装类来检索上下文,类似于以下内容:
internal static class ContextPerRequest
{
internal static DB1Entities Current
{
get
{
if (!HttpContext.Current.Items.Contains("myContext"))
{
HttpContext.Current.Items.Add("myContext", new DB1Entities());
}
return HttpContext.Current.Items["myContext"] as DB1Entities;
}
}
}
然后对其进行销毁处理
protected void Application_EndRequest(object sender, EventArgs e)
{
var entityContext = HttpContext.Current.Items["myContext"] as DB1Entities;
if (entityContext != null)
entityContext.Dispose();
}
这种修改方式确保您仅在需要时每个请求仅实例化和处理一次上下文。而选定的答案会每次都实例化上下文。
注意:DB1Entities是从DbContext派生出来的(由VS生成)。您可能想要使用您的上下文名称进行更改 ;)
注意2:在此示例中,我只使用了一个DbContext。如果您需要处理多个,请根据需要修改此代码。请不要把它看作解决世界问题的终极方案,因为它当然不是最终产品。它只是为了提示如何以非常简单的方式实现它。
注意3:相同的方法也可以在其他情况下使用,例如当您想共享SqlConnection或任何其他实例时......这个解决方案不仅限于DbContext对象,也不仅适用于Entity Framework。