Я создаю 4 многоуровневых веб-приложения ASP.NET. Слои:
Слой объекта имеет мои классы модели данных и создается из моей модели данных объекта (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?
Существует ли способ ограничить ленивую загрузку, чтобы только произойти в слое данных?
запрос
лениво вычисляется, поэтому данные не извлекаются из базы данных, пока вы их не перечислите.
Если вы сделаете:
return query.ToList();
, вы принудительно выполните запрос и избежите проблемы.
Вы получаете сообщение об ошибке, потому что, когда вызывающий абонент перечисляет коллекцию, ObjectContext ( dmc
) уже удален благодаря вашему с помощью предложения
(что хорошо - удаление, связанное с базой данных ресурсы рано!)
В исходном посте я использовал AsEnumerable ()
, который я считал правильным - до недавнего времени я сам не пытался использовать его в этой конкретной ситуации. AsEnumerable ()
выполняет преобразование типов только во время компиляции, но не перечисляет. Чтобы запрос был занумерован, его необходимо сохранить в List
или другом собрании.
Вы можете вызвать какой-нибудь метод для объекта query
, например
return query.AsEnumerable();
. Это должно гарантировать, что вы выполняете запрос, таким образом, вы убедитесь, что объект вам не нужен. контекст позже.