Экземпляр ObjectContext удален и больше не может использоваться для операций, требующих подключения. WCF с лазурной ошибкой

Редактировать: разобрались. В таблице были внешние ключи, к которым не обращались. Stackoverflow не позволил бы мне опубликовать ответ на него так близко к заданию вопроса

Я делаю приложение для Windows Phone, которое получает информацию из базы данных, хранящейся в Windows Azure, для этого я использую соединение WCF.

Но когда я отлаживаю и локально вызываю службу, я получаю следующую ошибку:

Экземпляр ObjectContext удален и больше не может использоваться для операций, требующих подключения.

Я использую код, адаптированный с http://mobile.dzone.com/news/how-use-wcf-services-access-0 (раздел LoginUser) Код с этого сайта работает нормально, но, как я уже сказал, мой вызывает эту ошибку.

Вот мой код:

    public Product GetProduct(String Barcode)
    {
        string query = @"SELECT value Product FROM AzureDBEntities.Products AS Product WHERE Product.barcode = @Barcode";
        ObjectParameter parameter = new ObjectParameter("Barcode", Barcode);

        using (var context = new AzureDBEntities())
        {
            ObjectQuery<Product> results = context.CreateQuery<Product>(query, parameter);

            foreach (Product result in results)
            {
                if (result != null)
                {
                    return result;
                }
            }
        }
        return null;
    }

Любые идеи Что я сделал не так? Огромное спасибо.


person IntSec    schedule 22.04.2012    source источник
comment
WCFServiceWebRole1.dll!WCFServiceWebRole1.Product.Producer1.get() Строка 1028 + 0x34 байта, это то, что вам нужно?   -  person IntSec    schedule 22.04.2012


Ответы (2)


Передайте объект экземпляру вашего ObjectContext через его метод отсоединения. Это уничтожит ваши навигационные коллекции, но вам не придется отключать ленивую загрузку.

public Product GetProduct(String Barcode)
{
    string query = @"SELECT value Product FROM AzureDBEntities.Products AS Product WHERE Product.barcode = @Barcode";
    ObjectParameter parameter = new ObjectParameter("Barcode", Barcode);

    using (var context = new AzureDBEntities())
    {
        ObjectQuery<Product> results = context.CreateQuery<Product>(query, parameter);

        foreach (Product result in results)
        {
            if (result != null)
            {
                context.Detach(result);
                return result;
            }
        }
    }
    return null;
}
person Sean Howard    schedule 21.12.2012

В комментарии к вашему ответу вы указываете, что ошибка вызвана следующим: WCFServiceWebRole1.dll!WCFServiceWebRole1.Product.Producer1.get()

Это указывает на то, что кто-то пытается получить доступ к свойству Producer вашего объекта Product (вероятно, это вызвано сериализацией WCF). Не могли бы вы попробовать отключить ленивую загрузку и создание прокси в вашем контексте?

using (var context = new MyEntities())
{
    context.ContextOptions.LazyLoadingEnabled = false;
    context.ContextOptions.ProxyCreationEnabled = false;
}
person Sandrino Di Mattia    schedule 22.04.2012