异常连接';的当前状态在使用实体框架时被破坏

本文关键字:实体 框架 状态 连接 异常 | 更新日期: 2023-09-27 18:21:36

我对EF很陌生。。。目前,我正在用EF在asp.net中开发一个网站,有时我会遇到连接方面的异常。

我读过这篇文章https://github.com/geersch/EntityFrameworkObjectContext根据这个我已经编程:

public static class ObjectContextPerHttpRequest
{
    public static tradeEntities Context
    {
        get
        {
            string objectContextKey = HttpContext.Current.GetHashCode().ToString("x");
            if (!HttpContext.Current.Items.Contains(objectContextKey))
            {
                HttpContext.Current.Items.Add(objectContextKey, new tradeEntities());
            }
            return HttpContext.Current.Items[objectContextKey] as tradeEntities;
        }
    }
}

然后我使用myEntities et = p.ObjectContextPerHttpRequest.Context;

在我的网站上的某个地方,我需要获得产品。。。为了做到这一点,我使用这个:

    public List<tProducts> returnProductsFromSubcategory(int subcategoryID)
    {
        var prod = from p in et.tProducts
                   from c in et.tCompany
                   where (c.companyID == p.fk_companyID && c.enable == true)
                   where (p.subCategoryID == subcategoryID && p.enable == true)
                   select p;
        //et.Connection.Close();
        return prod.ToList(); //Here comes an Exception The connection's current state is broken.
    }

有时它还可以,但有时我会遇到一个例外。

System.InvalidOperationException命令的执行需要打开且可用的连接。连接的当前状态为破碎的

我不确定出了什么问题。我已经读到我应该实现dispose函数,但在哪里添加它以及如何实现它?

非常感谢您的帮助。

Martin

异常连接';的当前状态在使用实体框架时被破坏

要处理对象上下文,您应该将查询包装在using语句中。

public List<tProducts> returnProductsFromSubcategory(int subcategoryID) 
{ 
    using(var et = new tradeEntities())
    {
        var prod = from p in et.tProducts 
                   from c in et.tCompany 
                   where (c.companyID == p.fk_companyID && c.enable == true) 
                   where (p.subCategoryID == subcategoryID && p.enable == true) 
                   select p; 
        return prod.ToList(); 
    }    
} 

这将自动处理对象上下文,并正确关闭与数据库的连接,使其能够返回到连接池。我建议将您的所有查询封装在using块中。

您必须处理您的上下文。您可以使用"using"运算符,也可以调用"Dispose"方法
在这里,我们将更详细地讨论这个问题。