Экземпляр ObjectContext был удален и больше не может использоваться для операций, требующих подключения - PullRequest
1 голос
/ 19 сентября 2011

Это не имеет никакого смысла.Запрос, который я выполняю, показан ниже.Результат запроса привязан к форме данных.

    public Message GetMessage(Guid authorizationKey)
    {
        using (MyEntities context = new MyEntities())
        {
            var result = (from message in context.Messages
                              .Include("Attachments")
                              .Include("Authentication")
                          join authentication in context.Authentications on message.Authentication.AuthenticationId equals authentication.AuthenticationId
                          where authentication.AuthorizationKey == authorizationKey
                          select message).FirstOrDefault();

            return result;
        }
    }

Странное дерьмо: если я поставлю точку останова, пройдусь по запросу и с привязкой данных все будет работать.Как только я удаляю точку останова, мое свойство nav для аутентификации не загружается.Может кто-нибудь пролить свет на то, почему это происходит?

1 Ответ

3 голосов
/ 19 сентября 2011

Включить и выбрать не работают вместе.

Вы говорите DataContext вернуть переменную сообщения, которая содержит только сообщение (даже если у вас есть операторы include для объекта context.Messages).Это можно исправить двумя способами:

1) Сообщение проекта, Вложения, Аутентификация в объекте POCO в вашем операторе select

        var result = (from message in context.Messages 
                          .Include("Attachments") 
                          .Include("Authentication") 
                      join authentication in context.Authentications on message.Authentication.AuthenticationId equals authentication.AuthenticationId 
                      where authentication.AuthorizationKey == authorizationKey 
                      select new MessageWithNavigations()
{
Message = message,
Authentication = message.Authentication,
Attachments = message.Attachments,
}).FirstOrDefault(); 

        return result; 

2) Использовать беглую нотацию для всего запрашиваемого

var result = context.Messages
    .Include("Attachments")
    .Include("Authentication")
    .Where(m => m.Authentication.AuthorizationKey == authorizationKey)
    .FirstOrDefault();

Проблема с # 1 заключается в том, что вы не сможете ничего сделать с экземплярами объекта, который бы инициировал запрос (например, с навигацией), или изменить какие-либо свойства этих объектов.Проекция предоставляет только объекты, доступные только для чтения.

С # 2 может быть лучше использовать .SingleOrDefault вместо FirstOrDefault, если ваш AuthorizationKey является уникальным значением / первичным ключом.

Сутьпроблема в том, что использование include с select в одном и том же объекте IQueryable существенно сбивает с толку дерево выражений построителя запросов и игнорирует ваши операторы include.

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