Лётная загрузка против желаемой загрузки
Ленивая загрузка в Entity Framework - это явление по умолчанию, которое происходит для загрузки и доступа к связанным объектам. Тем не менее, страстная загрузка относится к практике принудительной загрузки всех этих отношений. Я столкнулся с вопросом о том, в какой ситуации интенсивная загрузка может быть более выгодной, чем ленивая загрузка. Запрашивая это, потому что очевидно, что ленивая загрузка более ресурсоемкая, и даже если мы используем метод ToList()
, мы все равно можем воспользоваться ленивым поведением загрузки. Тем не менее, я думал, что, может быть, ленивая загрузка увеличивает количество запросов к фактической базе данных, и, может быть, поэтому иногда разработчики используют метод Inlcude
для принудительной загрузки всех отношений. Например, при использовании автоустановок Visual Studio в MVC 5 метод Index, который автоматически создается в контроллере, всегда использует Eager Loading, и у меня всегда возникал вопрос, почему Microsoft использует Eager Loading по умолчанию в этом случае.
Я был бы признателен, если бы кто-то объяснил мне, в какой ситуации ожидаемая загрузка будет более выгодной, чем ленивая загрузка, и почему мы используем ее вообще, пока есть что-то более дружелюбное к ресурсу, как Lazy Loading.
Ответы
Ответ 1
Я думаю, что хорошо классифицировать такие отношения
Когда использовать загружаемую загрузку
- В "одной стороне" отношений "один ко многим", которые вы обязательно используете везде, где есть основной объект. как пользовательское свойство статьи. Свойства категории продукта.
- Обычно, когда отношения не слишком велики, и желаемая загрузка будет хорошей практикой, чтобы уменьшить дальнейшие запросы на сервере.
Когда использовать ленивую загрузку
- Почти на каждой "коллекционной стороне" отношений "один ко многим". как статьи пользователя или продукты категории.
- Вы точно знаете, что вам не понадобится свойство мгновенно.
Примечание:, например, Transcendent, может возникнуть проблема с ленивой загрузкой.
Ответ 2
Lazy loading приведет к нескольким SQL-вызовам, в то время как загрузка Eager может загружать данные одним "более тяжелым" вызовом (с объединениями/подзапросами).
Например, если между серверами web и sql существует высокий уровень, вы можете использовать загрузку Eager вместо загрузки связанных элементов 1 на 1 с ленивой загрузкой.
Ответ 3
Оживленная загрузка:
Eager Loading позволяет загружать все нужные вам объекты одновременно. т.е. связанные объекты (дочерние объекты)
автоматически загружаются родительским объектом.
Когда использовать:
- Используйте Eager Loading, если отношения не слишком велики.
Таким образом, Eager Loading является хорошей практикой для сокращения дополнительных запросов на сервере.
- Используйте Eager Loading, если вы уверены, что повсюду будете использовать связанные сущности с основной сущностью.
Lazy Loading:
В случае ленивой загрузки связанные объекты (дочерние объекты) не загружаются автоматически
с его родительским объектом, пока они не будут запрошены.
По умолчанию LINQ поддерживает ленивую загрузку.
Когда использовать:
- Используйте Lazy Loading, когда вы используете коллекции "один ко многим".
- Используйте Lazy Loading, если вы уверены, что мгновенно не используете связанные объекты.
ПРИМЕЧАНИЕ. Entity Framework поддерживает три способа загрузки связанных данных - нетерпевая загрузка, ленивая загрузка и явная загрузка.
Ответ 4
Рассмотрим приведенную ниже ситуацию
public class Person{
public String Name{get; set;}
public String Email {get; set;}
public virtual Employer employer {get; set;}
}
public List<EF.Person> GetPerson(){
using(EF.DbEntities db = new EF.DbEntities()){
return db.Person.ToList();
}
}
Теперь, после вызова этого метода, вы не сможете больше ленить загружать объект Employer
. Зачем? потому что объект db
расположен. Поэтому вы должны сделать Person.Include(x=> x.employer)
, чтобы заставить загружаться.
Ответ 5
Нежелательная загрузка Когда вы уверены, что хотите получать несколько объектов одновременно, например, вы должны показывать пользователя и данные пользователя на той же странице, то вам следует идти с нетерпением загрузки. Нежелательная загрузка делает одно попадание в базу данных и загружает связанные объекты.
Lazy loading Когда вам нужно показывать пользователей только на странице, и, нажимая на пользователей, вам нужно показать данные пользователя, тогда вам нужно идти с ленивой загрузкой. Lazy loading делает несколько обращений, чтобы загрузить связанные объекты, когда вы привязываете/итерации связанных объектов.
Ответ 6
// Using LINQ and just referencing p.Employer will lazy load
// I am not at a computer but I know I have lazy loaded in one
// query with a single query call like below.
List<Person> persons = new List<Person>();
using(MyDbContext dbContext = new MyDbContext())
{
persons = (
from p in dbcontext.Persons
select new Person{
Name = p.Name,
Email = p.Email,
Employer = p.Employer
}).ToList();
}
Ответ 7
Я нашел отличную статью, которая объясняет, почему НЕ ИСПОЛЬЗУЙТЕ ленивую загрузку в проектах Entity Framework и ASP.NET.
https://ardalis.com/avoid-lazy-loading-entities-in-asp-net-applications
Ответ 8
Лучше использовать активную загрузку, когда это возможно, потому что это оптимизирует производительность вашего приложения.
ex-:
Eager loading
var Customers = _context.customers.Include(c => c.membershipType).Tolist();
lazy loading
задавать;}
Таким образом, при запросе отложенной загрузки значительно медленнее загружаются все ссылочные объекты, но при этом загружается запрос и выбирается только тот объект, который актуален.