Платформа Объекта ASP.NET, objectcontext ошибка

Я создаю 4 многоуровневых веб-приложения ASP.NET. Слои:

  1. Слой данных
  2. Слой объекта
  3. Бизнес-слой
  4. Слой UI

Слой объекта имеет мои классы модели данных и создается из моей модели данных объекта (edmx файл) в datalayer, использующем шаблоны T4 (ПОСТЕПЕННО). На слой объекта ссылаются во всех других слоях.

Мой слой данных имеет класс под названием SourceKeyRepository, который имеет функцию как так:

public IEnumerable<SourceKey> Get(SourceKey sk)
{
    using (dmc = new DataModelContainer())
    {
        var query = from SourceKey in dmc.SourceKeys
                    select SourceKey;

        if (sk.sourceKey1 != null)
        {
            query = from SourceKey in query
                    where SourceKey.sourceKey1 == sk.sourceKey1
                    select SourceKey;
        }

        return query;
    }
}

Ленивая загрузка отключена, так как я не хочу, чтобы мои запросы работали в других слоях этого приложения. Я получаю следующую ошибку при попытке получить доступ к информации в уровне UI:

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

Я уверен, что это вызвано тем, что мой DataModelContainer "dmc" был расположен. Как я могу возвратить этот объект IEnumerable из своего слоя данных так, чтобы он не полагался на ObjectContext, но только на DataModel?

Существует ли способ ограничить ленивую загрузку, чтобы только произойти в слое данных?

11
задан Chris Klepeis 21 May 2010 в 17:49
поделиться

2 ответа

запрос лениво вычисляется, поэтому данные не извлекаются из базы данных, пока вы их не перечислите.

Если вы сделаете:

return query.ToList();

, вы принудительно выполните запрос и избежите проблемы.

Вы получаете сообщение об ошибке, потому что, когда вызывающий абонент перечисляет коллекцию, ObjectContext ( dmc ) уже удален благодаря вашему с помощью предложения (что хорошо - удаление, связанное с базой данных ресурсы рано!)

Править

В исходном посте я использовал AsEnumerable () , который я считал правильным - до недавнего времени я сам не пытался использовать его в этой конкретной ситуации. AsEnumerable () выполняет преобразование типов только во время компиляции, но не перечисляет. Чтобы запрос был занумерован, его необходимо сохранить в List или другом собрании.

18
ответ дан 3 December 2019 в 02:52
поделиться

Вы можете вызвать какой-нибудь метод для объекта query , например

return query.AsEnumerable();

. Это должно гарантировать, что вы выполняете запрос, таким образом, вы убедитесь, что объект вам не нужен. контекст позже.

5
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: