2016-02-12 2 views
5

У меня очень сложная проблема: метод расширения ToList() не может преобразовать результаты в список. Вот мой код, стандартный шаблонный запросов LINQ, я преобразовал ToList() дважды для хорошей мерыLinq ToList() не запускает немедленное выполнение

var assets = new List<Asset>(); 

using (var ctx = new LeaseContext()) 
{ 
    assets = ctx.Assets.OrderBy(o => o.Reference).Where(w => w.Status == AssetStatus.Active).ToList(); 

    assets.ToList(); 
} 

return assets; 

еще активы по-прежнему список System.Data.Entities.DynamicProxies ....

Я никогда не имел эту проблему раньше.

+0

Почему вы используете ToList() для одной и той же переменной? –

+0

Второй 'ToList()' ничего не делает, поскольку вы не используете результат 'ToList()'. –

+0

Я знаю, что второй ToList() избыточен, я просто хотел протестировать. – franklores

ответ

8

Причина - ленивая загрузка. Когда в EF включена ленивая загрузка (по умолчанию), то (опять же, по умолчанию) EF создает динамические прокси для каждого объекта. Это необходимо для загрузки связанных объектов. Динамический прокси будет унаследован от класса сущности. Таким образом, в вашем случае он будет унаследован от Asset. Но динамический прокси будет ссылаться на контекст, который создал свой экземпляр. И он переопределит свойства навигации (которые являются виртуальными) для запроса объектов через контекст, который хранится в динамическом прокси.

И вполне законно добавлять экземпляры производных типов в список базового типа.

Если вы не хотите, динамические прокси, то просто отключить отложенную загрузку и прокси создание:

ctx.Configuration.LazyLoadingEnabled = false; // turn-off loading on-demand 
ctx.Configuration.ProxyCreationEnabled = false; // turn-off wrapper class generation 

Технически вы можете просто включить-выключить поколение прокси и отложенной загрузки не будет работать. Но я предпочитаю отключать обе настройки явно.

+0

Я добавил заявление, но все равно не работает. используя (вар CTX = новый LeaseContext()) \t \t \t { \t \t \t \t ctx.Configuration.LazyLoadingEnabled = ложь; \t \t \t \t assets = ctx.Assets.OrderBy (o => o.Reference) .Where (w => w.Status == AssetStatus.Active). Выбрать (x => x) .ToList(); \t \t \t} \t \t \t \t \t \t возврата активов; – franklores

+0

@franklores вы должны добавить это утверждение, прежде чем использовать 'cxt' для запроса активов –

+0

@franklores извините, я забыл о второй настройке конфигурации - есть отдельный для отключения создания прокси –

Смежные вопросы