Подтвердить что ты не робот

Лётная загрузка против желаемой загрузки

Ленивая загрузка в Entity Framework - это явление по умолчанию, которое происходит для загрузки и доступа к связанным объектам. Тем не менее, страстная загрузка относится к практике принудительной загрузки всех этих отношений. Я столкнулся с вопросом о том, в какой ситуации интенсивная загрузка может быть более выгодной, чем ленивая загрузка. Запрашивая это, потому что очевидно, что ленивая загрузка более ресурсоемкая, и даже если мы используем метод ToList(), мы все равно можем воспользоваться ленивым поведением загрузки. Тем не менее, я думал, что, может быть, ленивая загрузка увеличивает количество запросов к фактической базе данных, и, может быть, поэтому иногда разработчики используют метод Inlcude для принудительной загрузки всех отношений. Например, при использовании автоустановок Visual Studio в MVC 5 метод Index, который автоматически создается в контроллере, всегда использует Eager Loading, и у меня всегда возникал вопрос, почему Microsoft использует Eager Loading по умолчанию в этом случае.

Я был бы признателен, если бы кто-то объяснил мне, в какой ситуации ожидаемая загрузка будет более выгодной, чем ленивая загрузка, и почему мы используем ее вообще, пока есть что-то более дружелюбное к ресурсу, как Lazy Loading.

4b9b3361

Ответ 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();
}

Ответ 8

Лучше использовать активную загрузку, когда это возможно, потому что это оптимизирует производительность вашего приложения.

ex-:

Eager loading

var Customers = _context.customers.Include(c => c.membershipType).Tolist();

lazy loading

задавать;}

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