Отложенная загрузка и быстрая загрузка — как я могу это проверить?

#c# #entity-framework

#c# #entity-framework

Вопрос:

У меня есть тип объекта POCO:

 public class Blog 
{  
    public int BlogId { get; set; }  
    public string Name { get; set; }  
    public string Url { get; set; }  
    public string Tags { get; set; }  

    public virtual ICollection<Post> Posts { get; set; }  
}
 

Как я могу проверить в отладчике Visual Studio, что этот запрос получает только блоги:

 var result1 = context.Blog.ToList();
 

И этот запрос получает блоги вместе с сообщениями как часть запроса:

 var result2 = context.Blog.Include(x => x.Posts).ToList();
 

Возможно ли это?

Ответ №1:

В контексте найдите свойство, касающееся отложенной загрузки (context.Configuration.LazyLoadingEnabled) и, отключив его, добавьте наблюдение за результатом1.Сообщения, и ничего не должно было быть загружено.

И наоборот, результат2.После проверки сообщения должны содержать элементы. Конечно, это зависит от подключаемых записей в базе данных!

Другим контрольным признаком является прокси-объект в Posts, collection, который будет иметь странное имя, если включена отложенная загрузка.

Комментарии:

1. В обоих случаях: result1 и result2 получили сообщения.

2. Итак, вы выполнили те проверки, о которых я упоминал? Я только что обновил сообщение, чтобы включить свойство. Я не мог вспомнить это сразу.

3. Я включил отложенную загрузку и добавил просмотр в result1 и result2.

Ответ №2:

Я бы предположил, что отладчик не является подходящим местом для мониторинга подобных вещей. Вместо этого я бы использовал профилировщик SQL Server или специальный инструмент, такой как EFProf.

Ответ №3:

Конечно, дилемма заключается в том, что, как только вы обращаетесь к blog.После публикации вы получите элементы, но в этот момент вы больше не можете сказать, когда / как они были загружены. (Если вы не отслеживаете SQL).

Вы можете быть уверены на 100%, если проверите локальную коллекцию:

 var result1 = context.Blog.ToList();
var postsLoaded = context.Posts.Local.Any(); // false.


var result2 = context.Blog.Include(x => x.Posts).ToList();
var postsLoaded = context.Posts.Local.Any(); // true. 
// (if Blogs having Posts were loaded)