Исключение. Текущее состояние соединения нарушается при использовании структуры объекта. - PullRequest
1 голос
/ 28 января 2012

Я довольно новичок в EF ... в настоящее время я занимаюсь разработкой веб-сайта на asp.net с EF, и иногда я получаю исключения о подключении.

Я читал эту статью http://cgeers.com/2009/02/21/entity-framework-objectcontext/ В соответствии с этим я запрограммировал:

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.InvalidOperationExceptionExecution для команды требуется открытое и доступное соединение. Текущее состояние соединения сломаны.

Я не уверен, что не так. Я прочитал, что я должен реализовать функцию dispose, но где ее добавить и как я могу это сделать?

Заранее большое спасибо за помощь.

Martin

Ответы [ 2 ]

1 голос
/ 04 апреля 2012

Чтобы избавиться от контекста объекта, вы должны заключить ваши запросы в оператор 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.

0 голосов
/ 08 мая 2014

Вы должны избавиться от своего контекста.Вы можете использовать оператор «using» или вызвать метод «Dispose».
Здесь проблема обсуждается более подробно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...