2015-11-04 2 views
0

ВопросОтключить Ленивые-Load Entity Framework Navigation Свойства

Есть ли способ сделать это так, что объект возвращается из запроса DbContext возвращает нуль (или какое-либо другое конкретное значение) при попытке получить доступ к навигации свойство, которое вы не указали конкретно .Include()? Например:

var parents = dbContext.People.Where(p => p.Children.Any()).Include("Children").ToList(); 
//Assert all parents have children... 
Assert.IsTrue(parents[0].Children.Any()); 

И ...

var parents = dbContext.People.Where(p => p.Children.Any()).ToList(); 
//Assert all children collections are null... NOT LAZY LOADED 
Assert.IsTrue(parents[0].Children == null); 

Чтобы было ясно, я не хочу, свойство быть Страстно-Loaded. Я не хочу, чтобы он был загружен вообще. Я попытался отделить объект от контекста, но это не помогает.

фон

Поэтому я пытаюсь сделать это, потому что мне нужно получить доступ к объекту сущности на diffrent нити, чем та DbContext была создана. Из-за этого я НЕ хочу, чтобы свойство навигации было настроено на какое-то заявление об отсроченном выводе excq. Проблема в том, что, поскольку я не могу получить доступ к DbContext, чтобы проверить, загружено ли свойство навигации или нет (из-за того, что он не является потокобезопасным), я не знаю, нужно ли мне создавать новый DbContext для текущего потока, чтобы получить отсутствующий данные. Это та же самая проблема, которую я пытался решить с How to tell if a Navigation Property is loaded without DbContext

Update

Установка свойства Configuration.LazyLoadingEnabled в DbContext к ложным предотвращает попадание LINQ автоматической проводкой, но для навигации свойства, коллекции это приводит к пустой коллекции, а не к нулю.

Чтобы решить проблему на основе коллекции, я изменил свой шаблон T4, чтобы сгенерировать пустой конструктор по умолчанию, а не тот, который устанавливает каждый ICollection равным пустой HashSet.

+0

попробовать .AsNoTracking(). – DevilSuichiro

+0

AsNoTracking() не позволяет контексту кэшировать объект, но доступ к свойству навигации по-прежнему вызывает попытку запросить контекст, из которого он был создан. – NuclearProgrammer

ответ

2

Вы можете включить/отключить отложенной загрузки, установив Configuration.LazyLoadingEnabled свойство вашего DbContext

context.Configuration.LazyLoadingEnabled = false; 
var parents = dbContext.People.Where(p => p.Children.Any()).ToList(); 
context.Configuration.LazyLoadingEnabled = true; 
+0

Спасибо! Это то, что я искал. Мне также нужно было обновить мой шаблон T4, чтобы не устанавливать свойства навигации на основе коллекции в пустую коллекцию. – NuclearProgrammer

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